0

情况

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

0 回答 0