繁体   English   中英

解码JSON Swift 4

[英]Decode JSON Swift 4

有人可以告诉我代码有什么问题吗? 我正在尝试将服务器中的JSON解析为变量以存储值。 当我运行代码时,我没有任何错误。 当我在解码数据后执行打印(用户)时,它没有返回任何内容。 有人可以帮我解决这个问题吗?

这是我用来从服务器检索数据的代码。

guard let url = URL(string: "my-url") else { return }
        let session = URLSession.shared
        let task = session.dataTask(with: url) { (data, _, _) in
            guard let data = data else { return }


            do {

                let user = try JSONDecoder().decode(User.self, from: data)
                print(user)

            } catch {}
        }
        task.resume()

服务器的JSON结果

{
"UserId": "55844ef7-3f05-4560-8b37-216df422ffb8",
"ContactsDto": [
    {
        "Id": null,
        "UserId": null,
        "FriendUserId": "e61d09f8-9aec-4035-b0be-c36abea2d82b",
        "FirstName": null,
        "LastName": null,
        "Email": "",
        "PhonePrefix": null,
        "Phone": "54943597",
        "InviteStatus": "pending",
        "UserStatus": null,
        "ErrorCode": 0,
        "ErrorMessage": null
    },
    {
        "Id": null,
        "UserId": null,
        "FriendUserId": "b2e0d6d7-d97c-475e-a2ab-71cb8091a7a0",
        "FirstName": null,
        "LastName": null,
        "Email": "",
        "PhonePrefix": null,
        "Phone": "207-7575",
        "InviteStatus": "pending",
        "UserStatus": null,
        "ErrorCode": 0,
        "ErrorMessage": null
    },
    {
        "Id": null,
        "UserId": null,
        "FriendUserId": "8f8d6061-3a69-4641-ac40-329a824ff4e1",
        "FirstName": null,
        "LastName": null,
        "Email": "",
        "PhonePrefix": null,
        "Phone": "58511968",
        "InviteStatus": "pending",
        "UserStatus": null,
        "ErrorCode": 0,
        "ErrorMessage": null
    },
    {
        "Id": null,
        "UserId": null,
        "FriendUserId": "40c1e461-eb98-4e18-9363-13cfa460fe7e",
        "FirstName": null,
        "LastName": null,
        "Email": "",
        "PhonePrefix": null,
        "Phone": "57864550",
        "InviteStatus": "accepted",
        "UserStatus": null,
        "ErrorCode": 0,
        "ErrorMessage": null
    }
],
"ErrorCode": 0,
"ErrorMessage": null

}

我的结构

struct User: Decodable {

let UserId: String?
let ContactsDto: [ContactsDto]?
let ErrorCode: Int?
let ErrorMessage: String?

}

struct ContactsDto : Decodable {

let Id : String?
let UserId : String?
let FriendUserId : String?
let FirstName : String?
let LastName : String?
let Email : String?
let PhonePrefix : String?
let Phone : String?
let InviteStatus : String?
let UserStatus : String?
let ErrorCode : String?
let ErrorMessage : String?

}

通过查看代码,您尝试解码JSON的方式不正确。

您不会返回一个User数组,而是一个User Object。

因此,您可以尝试以下操作:

let user = try! JSONDecoder().decode(User.self, from: data)

根据您的错误,并且正如Josh在评论中告诉您的那样,模型上的类型不正确。

例如,您的ContactDto对象之一是:

{
    "Id": null,
    "UserId": null,
    "FriendUserId": "e61d09f8-9aec-4035-b0be-c36abea2d82b",
    "FirstName": null,
    "LastName": null,
    "Email": "",
    "PhonePrefix": null,
    "Phone": "54943597",
    "InviteStatus": "pending",
    "UserStatus": null,
    "ErrorCode": 0,
    "ErrorMessage": null
},

ErrorCode类型是数字(看起来像整数),但是在您的模型结构中是String?。

请检查每个字段以获取所有类型,然后修复模型并重试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM