JSONDecoder改变元素的顺序

时间:2018-04-05 09:29:21

标签: json swift sorting decodable jsondecoder

情况

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

0 个答案:

没有答案