为啥反序列化 JSON 会给每个值 0

Posted

技术标签:

【中文标题】为啥反序列化 JSON 会给每个值 0【英文标题】:Why deserializing JSON gives 0 to each value为什么反序列化 JSON 会给每个值 0 【发布时间】:2017-03-16 09:44:24 【问题描述】:

我正在使用Alamofire 进行 GET 请求 - 它给了我状态码 200,结果很好,但是在我将 json 反序列化到数组中然后我尝试将值签名到自定义对象中然后它给了我总是 0。

json 看起来像:


  "user" : [
    
      "name" : "Jack",
      "lastname" : Sparrow
    ,
    
      "name" : "John",
      "lastname" : Smith
    
   ],
   "count" : 2

然后在我的模型中,我确实有属性 namelastnameinit(name: String, lastname: String) self.name = name self.lastname = lastname

GET 请求看起来像:

 Alamofire.request(BREADCRAMB_URL, method: .get, parameters: parameters).responseJSON  response in

            print("Get default graph request \(response.request!)")
            print("Get default graph response \(response.response!)")

            guard response.result.value != nil else 
                completion(nil, 0)
                return
            
            var objects: [User] = []
            let jsonArray = JSON(data: response.data!)
            let count = jsonArray["count"].intValue
            print(jsonArray.count)
            for(_ , dict) in jsonArray 
                print(dict.count)
                let thisObject = User.init(name: dict["name"].stringValue, lastname: dict["lastname"].stringValue)
                print(thisObject)
                objects.append(thisObject)
            
            completion(objects, count)
            print(objects.count)
            for o in objects 
                print(o.name)
                print(o.lastname)
            
        

提前致谢!

【问题讨论】:

因为您提供的 JSON 是字典,而不是顶层数组? let jsonDict = JSON(data: response.data!); let jsonUserArray = jsonDict["user"]; //then do you for loop with jsonUserArray 【参考方案1】:

使用AlamofireObjectMapper 库。它使映射对象变得容易。

// ViewController 内部

var objects = [User]()

var serverResponse : ServerResponce

private func downloadMainViewData()

        let params = ["":""]

        Alamofire.request(serverUrl, method: .get, parameters: params, encoding: JSONEncoding.default, headers: nil)
            .responseObject (response: DataResponse<ServerResponse>) in

                self.serverResponse = response.result.value

                if(self.serverResponse != nil)
                    self.objects = (response.result.value?.slideShow)!
                

        

    

// 类ServerResponce

    import ObjectMapper

    class ServerResponse : Mappable

        var slideShow : [Show]?


        required init?(map: Map) 

        

        func mapping(map: Map) 

            objects <- map["user"]


        

    

// 类用户

import ObjectMapper

class Uesr: Mappable

    var name : String?
    var lastName : String?

    required init(map: Map)

    

    func mapping(map: Map) 

        let transform = TransformOf<Int, String>(fromJSON:  (value: String?) -> Int? in
            // transform value from String? to Int?
            return Int(value!)
        , toJSON:  (value: Int?) -> String? in
            // transform value from Int? to String?
            if let value = value 
                return String(value)
            
            return nil
        )

        name <- map["name"]
        lastName <- map["lastname"]

    

【讨论】:

以上是关于为啥反序列化 JSON 会给每个值 0的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UserAuthExtensions.PopulateFromMap(session, jwtPayload) 不能在 ServiceStack.Auth 中正确反序列化带有转义的 json 值

无法反序列化当前的JSON对象,为啥

如何正确反序列化并从 JSON 获取值

为啥使用 System.Text.Json 的 JSON 反序列化这么慢?

使用 Jackson 反序列化 JSON - 为啥 JsonMappingException“没有合适的构造函数”?

为啥JSON字符串当中会出现反斜杠?