Ios 解码器在解析后洗牌JSON密钥(包含动态密钥)序列
我有类似前面提到的动态JSON键 使用decodable,我必须从json生成对象Ios 解码器在解析后洗牌JSON密钥(包含动态密钥)序列,ios,json,swift,decodable,jsondecoder,Ios,Json,Swift,Decodable,Jsondecoder,我有类似前面提到的动态JSON键 使用decodable,我必须从json生成对象 struct ChannelSequence : Codable { public var innerArray: [String: InnerChannelNode] private struct CustomCodingKeys: CodingKey { var stringValue: String init?(stringVa
struct ChannelSequence : Codable {
public var innerArray: [String: InnerChannelNode]
private struct CustomCodingKeys: CodingKey {
var stringValue: String
init?(stringValue: String) {
self.stringValue = stringValue
}
var intValue: Int?
init?(intValue: Int) {
return nil
}
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CustomCodingKeys.self)
self.innerArray = [String: InnerChannelNode]()
for key in values.allKeys {
let value = try values.decode(InnerChannelNode.self, forKey: CustomCodingKeys(stringValue: key.stringValue)!)
self.innerArray[key.stringValue] = value //<--------- here I lost the order
}
}
}
struct ChannelSequence:Codable{
公共变量innerArray:[字符串:InnerChannelNode]
私有结构CustomCodingKey:CodingKey{
var stringValue:String
初始化?(stringValue:String){
self.stringValue=stringValue
}
var intValue:Int?
初始化?(intValue:Int){
归零
}
}
init(来自解码器:解码器)抛出{
let values=try decoder.container(keyedBy:CustomCodingKeys.self)
self.innerArray=[字符串:InnerChannelNode]()
用于输入值。所有键{
让value=尝试values.decode(InnerChannelNode.self,forKey:CustomCodingKeys(stringValue:key.stringValue)!)
self.innerArray[key.stringValue]=value//JSON键没有定义的顺序。它们就像字典一样。{“a”:1,“b”:2}
和{“b”:2,“a”:1}
都是相同的JSON。既然你要把它们放在字典里,你为什么要在意呢?字典没有顺序。allKeys
以未定义的顺序返回值,它可能会在下一次调用中更改。此外,你不需要所有这些自定义解码逻辑。所有这些都可以由编译器合成。