使用键和任意类型值解码json

dy1byipe  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(109)

我有一个JSON文件,我想使用[String: Any]。我遇到的问题是,我得到了一个错误:
对示例方法“decode”的调用中没有完全匹配
我很想知道我错在哪里。

struct MyModel: Decodable {
    let myDictionary: [String: Any]

    private enum CodingKeys: String, CodingKey {
        case myDictionary
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let data = try container.decode([String: Any].self, forKey: .myDictionary)
        self.myDictionary = data
    }
}
hvvq6cgz

hvvq6cgz1#

问题是**[String:由于Any部分,Any]字典不符合Decodable协议。不会自动推断出哪个具体类型。
但是不用担心,在您的情况下这不是问题,您只需要读取文件内容并使用
JSONSerialization将其转换为[String:任何]**。

import Foundation

let json = """
{  
    "object": "customer",
    "id": "4yq6txdpfadhbaqnwp3",
    "email": "john.doe@example.com",
    "metadata": {
        "link_id": "linked-id",
        "buy_count": 4
    }
}
"""

struct Model {
    var dictionary: [String: Any]
    
    init() {
        dictionary = [:]
    }
    
    init(data: Data) {
        self.init()
        if let dictionary = try? JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] {
            self.dictionary = dictionary
        }
    }
    
    init(string: String) {
        self.init()
        if let data = string.data(using: .utf8) {
            self.init(data: data)
        }
    }
}

然后您可以决定是否要从StringData创建Model。

相关问题