用 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
【讨论】:
推荐的解决方案是后者:更改CodingKey
s 值以匹配属性,而不是相反。 (请记住,您还必须提供其他编码键以匹配其余属性。)
@ItaiFerber 我知道,我只是想指出大写/小写不匹配。我更新了答案。
@vadian 在CodingKey
中需要什么CityUser
..可以告诉我吗?或者在哪种情况下我们必须在CodingKey
中取实体@
如果您指定CodingKeys
,例如将一个键映射到不同的命名属性,您必须添加所有其他要编码/解码的键。
@AbecedarioPoint 是的。【参考方案2】:
也许这就是您正在寻找的,app.quicktype.io 如果我想通过可编码进行解析,我将使用它来解析。当然你也可以自己编写和编辑上述工具提供的模型?。
【讨论】:
以上是关于用 Codable,swift 4 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Codable 和 Swift 解析这个嵌套的 JSON?
使用 Codable 解析 JSON 响应会在 swift 中出现错误
如何使用 Codable 在 Swift 中使用动态文件名解析 JSON