代码之家  ›  专栏  ›  技术社区  ›  Ziyaad

解码JSON Swift 4

  •  0
  • Ziyaad  · 技术社区  · 8 年前

    有人能说出代码出了什么问题吗?我试图将来自服务器的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?
    

    }

    2 回复  |  直到 8 年前
        1
  •  1
  •   Manu Mateos    8 年前

    根据您的错误以及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 type是一个数字(看起来像一个整数),但在模型结构中是一个字符串?。

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

        2
  •  1
  •   BlackMirrorz    8 年前

    从您的代码来看,您试图解码JSON的方式是不正确的。

    返回的不是用户数组,而是单个用户对象。

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