首页 > 解决方案 > Swift - 如何将平面 json 解码为嵌套结构?

问题描述

假设我有以下 JSON,我想将其解码为特定结构。我该怎么做呢

JSON:

{
 "fullName": "Federico Zanetello",
 "id": 123456,
 "twitter": "http://twitter.com/zntfdr",
 "results": ["mate","bate"]
}

解码结构

struct Response {
    let data: UserData,
    let results: [String]
}

UserData结构_

Struct UserData {
   let fullName: String,
   let id: Int,
   let twitter: String
}

我做了我的研究,找不到有效的解决方案。这是我到目前为止写的代码

struct UserData: Decodable {
    let fullName: String
    let id: Int
    let twitter: String
    
    enum CodingKeys: String, CodingKey {
        case fullName
        case id
        case twitter
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.fullName = try container.decode(String.self, forKey: .fullName)
        self.id = try container.decode(Int.self, forKey: .id)
        self.twitter = try container.decode(String.self, forKey: .twitter)
    }
}

struct Respone: Decodable{
    let data: UserData
    let results: [String]
}

let json = """
{
 "fullName": "Federico Zanetello",
 "id": 123456,
 "twitter": "http://twitter.com/zntfdr",
 "results": ["mate","bate"]
}
""".data(using: .utf8)! // our data in native (JSON) format
let myStruct = try JSONDecoder().decode(MetaData.self, from: json) // Decoding our data
print(myStruct)

我收到 KeynotFound 错误,因为dataJSON 中不存在密钥。我该如何解决这个问题?

标签: iosswiftdecoding

解决方案


你可以这样做:

struct UserData: Decodable {
    let fullName: String
    let id: Int
    let twitter: String
}

struct Response: Decodable{
    let data: UserData
    let results: [String]
    
    enum CodingKeys : CodingKey {
        case results
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        results = try container.decode([String].self, forKey: .results)
        data = try decoder.singleValueContainer().decode(UserData.self)
    }
}

诀窍是在 中使用自定义解码Response,然后像平常一样解码后results,得到一个singleValueContainer. 此容器将包含 JSON 中的所有密钥,因此您可以使用此容器来解码UserData.


推荐阅读