提问人:iOS 提问时间:10/31/2023 最后编辑:iOS 更新时间:10/31/2023 访问量:73
Swift - 只解码感兴趣的元素
Swift - decode only interested elements
问:
我有一个巨大的json数据,从HTTP响应中获取,我只需要一个特定的部分被解码为模型。
{
"root1": {
"items": [
{
...
},
{
...
},
{
...
},
{
...
},
{
...
}
]
},
"root2": {
...
},
"page": {
"size": 10,
"totalElements": 5,
"totalPages": 1,
"number": 0
}
}
这是我的json模板,我不想为根元素创建模型。我只对数组感兴趣。有什么直接的解码方法吗?items
答:
2赞
Joakim Danielson
10/31/2023
#1
您可以使用枚举选择要解码的内容,但仍需要从顶层/根级别进行解码。CodingKey
struct Response: Decodable {
let root1: Root1
enum CodingKeys: String, CodingKey {
case root1
}
}
struct Root1: Decodable {
let items: [Item]
enum CodingKeys: String, CodingKey {
case items
}
}
然后解码可以按
var items: [Item] = []
do {
items = try JSONDecoder().decode(Response.self, from: data).root1.items
} catch {
}
评论
0赞
Alexander
11/1/2023
您不需要此处的手动实现。仅当结构的字段多于要解码的键(在这种情况下,编码键将是字段的子集),或者它们的名称与键名称不同时,这才适用CodingKey
0赞
Joakim Danielson
11/1/2023
是的,我明白。@ios您应该选择已接受的其他答案,以便我可以删除此答案
2赞
Dávid Pásztor
10/31/2023
#2
创建类型时,只需声明要从 JSON 解码的属性。所有您不关心的键都可以省略。你甚至不需要这个。Decodable
CodingKeys
将用于解码的属性视为一组最低要求,而不是一组完整的要求。解码永远不会失败,因为 JSON 中有一些键是你未在模型上指定的。Decodable
但是,您确实需要从顶层到所有中间级别进行解码,因此您必须声明顶级对象。
Decodable
模型:
struct Item: Decodable {
...
}
struct Root1: Decodable {
let items: [Item]
}
struct Response: Decodable {
let root1: Root1
}
译码:
let response = try JSONDecoder().decode(Response.self, from: json)
let items = response.root1.items
评论
2赞
Joakim Danielson
10/31/2023
我正在考虑当您的结构中有不在 json 中的属性时的情况。这是更好的答案,因为它的代码更少。
评论
init(from: Decoder)