这是我的JSON
{
"id": 1,
"user": {
"user_name": "Tester",
"real_info": {
"full_name":"Jon Doe"
}
},
"reviews_count": [
{
"count": 4
}
]
}
这是我想要保存的结构(不完整)
struct ServerResponse: Decodable {
var id: String
var username: String
var fullName: String
var reviewCount: Int
enum CodingKeys: String, CodingKey {
case id,
// How do i get nested values?
}
}
我在解码嵌套结构时看了Apple's Documentation,但我仍然不明白如何正确地执行不同级别的JSON . 任何帮助都感激不尽 .
5 回答
另一种方法是创建一个与JSON紧密匹配的中间模型(在quicktype.io之类的工具的帮助下),让Swift生成解码它的方法,然后在最终数据模型中挑选出你想要的部分:
这也允许您轻松遍历
reviews_count
,如果它将来包含多于1个值 .为了解决您的问题,您可以将
RawServerResponse
实现拆分为多个逻辑部分 .#1 . 实现属性和所需的编码密钥
#2 . 设置id属性的解码策略
#3 . 设置userName属性的解码策略
#4 . 设置fullName属性的解码策略
#5 . 为reviewCount属性设置解码策略
完成实施
用法
我不建议使用一个大的
CodingKeys
枚举来解码JSON所需的所有密钥,而是建议为每个嵌套的JSON对象拆分密钥,使用嵌套枚举来保留层次结构:这样可以更轻松地跟踪JSON中每个级别的键 .
现在,请记住:
keyed container用于解码JSON对象,并使用CodingKey符合类型(例如我们上面定义的那些)进行解码 .
unkeyed container用于解码JSON数组,并按顺序解码(即每次在其上调用解码或嵌套容器方法时,它都会前进到数组中的下一个元素) . 请参阅答案的第二部分,了解如何迭代一个 .
使用container(keyedBy:)从解码器获取顶级键控容器后(因为您在顶层有一个JSON对象),您可以重复使用这些方法:
nestedContainer(keyedBy:forKey:)从给定键的对象获取嵌套对象
nestedUnkeyedContainer(forKey:)从给定键的对象获取嵌套数组
nestedContainer(keyedBy:)从数组中获取下一个嵌套对象
nestedUnkeyedContainer()从数组中获取下一个嵌套数组
例如:
解码示例:
通过未加密钥的容器进行迭代
考虑您希望
reviewCount
是[Int]
的情况,其中每个元素表示嵌套JSON中"count"
键的值:您需要遍历嵌套的无键容器,在每次迭代时获取嵌套的键控容器,并解码
"count"
键的值 . 您可以使用unkeyed容器的count属性来预先分配结果数组,然后使用isAtEnd属性来迭代它 .例如:
这些家伙已经回答了我的问题,但我只是觉得我会在这里发布这个链接,这使得这更容易 - > https://app.quicktype.io/#l=swift
只需在左侧窗格中发布您的JSON响应,然后在右侧观看您的模型生成 . 当你刚开始时,这可以提供帮助 .
你也可以使用我编写的库KeyedCodable . 它将需要更少的代码 . 让我知道你对它的看法 .