Codable当您知道JSON数据的密钥格式时,该功能非常有用。但是,如果您不知道按键怎么办?我目前面临这个问题。
通常,我希望这样返回JSON数据:
{
"id": "<123>",
"data": [
{
"id": "<id1>",
"event": "<event_type>",
"date": "<date>"
},
{
"id": "<id2>",
"event": "<event_type>",
"date": "<date>"
},
]
}
Run Code Online (Sandbox Code Playgroud)
但这就是我要解码的内容:
{
"id": "123",
"data": [
{ "<id1>": { "<event>": "<date>" } },
{ "<id2>": { "<event>": "<date>" } },
]
}
Run Code Online (Sandbox Code Playgroud)
问题是:如何使用Codable密钥唯一的JSON解码?我觉得我缺少明显的东西。
这就是我希望做的,所以我可以使用Codable:
struct SampleModel: Codable {
let id: String
let data: [[String: [String: Any]]]
// MARK: - Decoding
enum CodingKeys: String, CodingKey {
case id = "id"
case data = "data"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(String.self, forKey: .id)
// This throws an error: Ambiguous reference to member 'decode(_:forKey:)'
data = try container.decode([[String: [String: Any]]].self, forKey: .data)
}
}
Run Code Online (Sandbox Code Playgroud)
这将引发错误: Ambiguous reference to member 'decode(_:forKey:)'
对于您完全改变的问题,解决方案非常相似。您的结构只是在数组上方添加了一层。不需要任何自定义解码,甚至不需要任何CodingKeys。
请注意,您不能Any在Codable中使用。
let json="""
{
"id": "123",
"data": [
{ "<id1>": { "<event>": "2019-05-21T16:15:34-0400" } },
{ "<id2>": { "<event>": "2019-07-01T12:15:34-0400" } },
]
}
"""
struct SampleModel: Codable {
let id: String
let data: [[String: [String: Date]]]
}
var decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
let res = try decoder.decode(SampleModel.self, from: json.data(using: .utf8)!)
print(res)
} catch {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
您原始问题的原始答案。
由于您有一个嵌套字典数组,其中没有固定的字典键,并且由于没有其他字段,因此可以将其解码为纯数组。
这是一个例子:
let json="""
[
{ "<id1>": { "<event>": "2019-07-01T12:15:34-0400" } },
{ "<id2>": { "<event>": "2019-05-21T17:15:34-0400" } },
]
"""
var decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
let res = try decoder.decode([[String: [String: Date]]].self, from: json.data(using: .utf8)!)
print(res)
} catch {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |