用 Codable,swift 4 解析 JSON

Posted

技术标签:

【中文标题】用 Codable,swift 4 解析 JSON【英文标题】:Parsing JSON with Codable, swift 4 【发布时间】:2018-01-29 11:57:08 【问题描述】:

我正在使用 Swift 4 和 Codables 来解析 JSON。

以下是我的 JSON:


    "data": 
        "email": "testuser14324@testuser.com",
        "cityUserId": 38,        
        "CityUser": 
            "isEmailVerified": false,
            "UserId": 711
        ,
        "tokenInfo": 
            "accessToken": "eyJsds"
        
    ,
    "error": false

以下是我正在使用的模型

struct RootClass : Codable 
    let data : Data?
    let error : Bool?

对于数据:

struct Data : Codable 

    let cityUser : CityUser?
    let cityUserId : Int?
    let email : String?
    let tokenInfo : TokenInfo?

对于城市用户:

struct CityUser : Codable 

    let userId : Int?
    let isEmailVerified : Bool?

    enum CodingKeys: String, CodingKey 
        case userId = "UserId"
        case isEmailVerified = "isEmailVerified"
    

代币:

struct TokenInfo : Codable 

    let accessToken : String?

将其解码为:

 let response = try JSONDecoder().decode(RootClass.self, from: resJson as! Data)

问题:

response.data?.email = testuser14324@testuser.com
response.data?.tokenInfo?.accessToken = eyJsds
response.data?.cityUser = nil

它正在返回正确的电子邮件、cityUserId、tokenInfo.accessToken,但它正在为“CityUser”返回“nil”。我该怎么办?

【问题讨论】:

【参考方案1】:

这是将所有内容都声明为可选的最大缺点。你得到nil,但你不知道,为什么?。

这只是一个错字:该属性必须与键的拼写匹配(在这种情况下以大写字母开头)

let CityUser : CityUser?

但是,为了符合 Swift 命名约定,建议使用 CodingKeys 将大写转换为小写,并在必要时将 snake_case 转换为 camelCase。顺便说一句,Data 是 Swift 3+ 的 Foundation 框架中的一个结构体,例如使用另一个名称

struct ProfileData : Codable 

    let cityUser : CityUser
    let cityUserId : Int
    let email : String
    let tokenInfo : TokenInfo

    private enum CodingKeys: String, CodingKey 
        case cityUser = "CityUser"
        case cityUserId, email, tokenInfo
    

【讨论】:

推荐的解决方案是后者:更改CodingKeys 值以匹配属性,而不是相反。 (请记住,您还必须提供其他编码键以匹配其余属性。) @ItaiFerber 我知道,我只是想指出大写/小写不匹配。我更新了答案。 @vadian 在CodingKey 中需要什么CityUser..可以告诉我吗?或者在哪种情况下我们必须在CodingKey中取实体@ 如果您指定CodingKeys,例如将一个键映射到不同的命名属性,您必须添加所有其他要编码/解码的键。 @AbecedarioPoint 是的。【参考方案2】:

也许这就是您正在寻找的,app.quicktype.io 如果我想通过可编码进行解析,我将使用它来解析。当然你也可以自己编写和编辑上述工具提供的模型?。

【讨论】:

以上是关于用 Codable,swift 4 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Codable 和 Swift 解析这个嵌套的 JSON?

使用 Codable 解析 JSON 响应会在 swift 中出现错误

如何使用 Codable 在 Swift 中使用动态文件名解析 JSON

Swift 获取 HTTP JSON 响应并使用 Codable 解析它

使用 Codable 解析 JSON 数据

swift 中使用Codable进行数据解析