我正在尝试解码格式的简单JSON对象:
{
"firstArray": [
"element1",
"element2"
],
"secondArray": [
"elementA",
"elementB",
"elementC"
],
"*": [
"bestElement"
]
}
结果应该是名为ChainStore
的自定义对象,其中包含Chain
个实例的数组。每个Chain
都包含一个标识符和字符串数组。见下文。
我希望ChainStore
中的链数组与输入JSON中定义的顺序相同。但是出于某种原因,它会使特殊*
链的位置错误。所有其他元素都保持在其定义的位置,所以我非常有信心它不仅仅因为某些原因而被订购。
实际结果,如果我只是打印数组,看起来像这样:
*
bestElement
secondArray
elementA
elementB
elementC
firstArray
element1
element2
我很确定我在这里的文档中遗漏了一些内容。
知道为什么它不尊重我的订单或为什么它应用这个看似随机的订单?
谢谢!
var json = """
{
"firstArray": [
"element1",
"element2"
],
"secondArray": [
"elementA",
"elementB",
"elementC"
],
"*": [
"bestElement"
]
}
""".data(using: .utf8)!
struct ChainService: Decodable {
let chains: [Chain]
struct ChainKey: CodingKey {
var stringValue: String
init?(stringValue: String) {
self.stringValue = stringValue
}
var intValue: Int? { return nil }
init?(intValue: Int) { return nil }
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ChainKey.self)
var chains = [Chain]()
for key in container.allKeys {
let identifier = key.stringValue
let elements = try container.decode([String].self, forKey: key)
let chain = Chain(identifier: identifier, providers: elements)
chains.append(chain)
}
self.chains = chains
}
}
struct Chain {
let identifier: String
let providers: [String]
}
let decoder = JSONDecoder()
let chainStore = try decoder.decode(ChainService.self, from: json)
for chain in chainStore.chains {
print(chain.identifier)
for element in chain.providers {
print("\t\(element)")
}
}