情况
我正在尝试解码表单的简单 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)")
}
}