有没有办法在不创建顶级结构的情况下将 JSON 解码为结构

问题描述

我需要一种方法将 JSON 解码为 Swift 结构,但不是从 JSON 的顶层开始解码。

例如,我有一些这样的 JSON 响应

{"response": { "name": "John","id": 2"} }

实际上,我只需要带有 name 和 id 字段的嵌套对象,我的结构中不需要顶级“响应”。

所以问题是:
我可以在没有“响应”顶层的情况下解码该嵌套对象吗?
但是如果我能检查一下这个顶级“响应”是否存在,然后解码就好了。

我的 API 返回内部有响应对象的顶级“响应”或内部有错误对象的顶级“错误”,所以我必须在解码前检查是否有错误或响应。

解决方法

您需要包含所有内容,但如果您不想从顶层创建结构,您可以将其解码为字典

struct Person: Decodable {
    let id: Int
    let name: String
}

do {
    let result = try JSONDecoder().decode([String: Person].self,from: data)
    
    if let response = result["response"] {
        print(response)
    } else if let error = result["error"] {
        print(error)
    } else {
        print("Unknown result from API call")
    }
}
,

您可以尝试使用 ObjectMapper 并这样做:Mapping of Nested Objects

func mapping(map: Map) {
    name <- map["response.name"]
    id   <- map["response.id"]
}