Swift - 只解码感兴趣的元素

Swift - decode only interested elements

提问人:iOS 提问时间:10/31/2023 最后编辑:iOS 更新时间:10/31/2023 访问量:73

问:

我有一个巨大的json数据,从HTTP响应中获取,我只需要一个特定的部分被解码为模型。

{
    "root1": {
        "items": [
            {
                ...
            },
            {
                ...
            },
            {
                ...
            },
            {
                ...
            },
            {
                ...
            }
        ]
    },
    "root2": {
        ...
    },
    "page": {
        "size": 10,
        "totalElements": 5,
        "totalPages": 1,
        "number": 0
    }
}

这是我的json模板,我不想为根元素创建模型。我只对数组感兴趣。有什么直接的解码方法吗?items

iOS 数组 JSON Swift JsonDecoder

评论

1赞 tomerpacific 10/31/2023
将 JSON 字符串转换为 JSON,然后提取 items 键作为模型?
2赞 Sulthan 10/31/2023
手动实施。init(from: Decoder)

答:

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 解码的属性。所有您不关心的键都可以省略。你甚至不需要这个。DecodableCodingKeys

将用于解码的属性视为一组最低要求,而不是一组完整的要求。解码永远不会失败,因为 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 中的属性时的情况。这是更好的答案,因为它的代码更少。