为啥反序列化 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
然后在我的模型中,我确实有属性 name
和 lastname
和 init(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 值
为啥使用 System.Text.Json 的 JSON 反序列化这么慢?