所以我正在使用可编码协议将JSON解析为一个对象。 我现在面临的是,接收json的顺序与在对象中对其进行解码后的顺序不同。即密钥顺序不符合json。
我知道这不是Swift的限制。 Swift和JSON字典都是无序的。 JSON格式不能保证键顺序,因此不需要解析器来保留顺序
但是有什么办法可以维持订单?
答案 0 :(得分:1)
在您的代码中添加MutableOrderedDictionary
类:
class MutableOrderedDictionary: NSDictionary {
let _values: NSMutableArray = []
let _keys: NSMutableOrderedSet = []
override var count: Int {
return _keys.count
}
override func keyEnumerator() -> NSEnumerator {
return _keys.objectEnumerator()
}
override func object(forKey aKey: Any) -> Any? {
let index = _keys.index(of: aKey)
if index != NSNotFound {
return _values[index]
}
return nil
}
func setObject(_ anObject: Any, forKey aKey: String) {
let index = _keys.index(of: aKey)
if index != NSNotFound {
_values[index] = anObject
} else {
_keys.add(aKey)
_values.add(anObject)
}
}
}
在您的代码中添加此功能:
//MARK: - Sort Dictionary Key by the Ascending order
static func sortDictionaryKey(dictData : [String : Any]) -> MutableOrderedDictionary {
// initializing empty ordered dictionary
let orderedDic = MutableOrderedDictionary()
// copying normalDic in orderedDic after a sort
dictData.sorted { $0.0.compare($1.0) == .orderedAscending }
.forEach { orderedDic.setObject($0.value, forKey: $0.key) }
// from now, looping on orderedDic will be done in the alphabetical order of the keys
orderedDic.forEach { print($0) }
return orderedDic
}
您需要将字典传递给sortDictionaryKey
函数:
let sortedDict = self.sortDictionaryKey(dictData: YourDictionary)
此代码将字典按字母顺序排序。
希望这对您有用。
答案 1 :(得分:0)
Dictionary
是快速无序集合。如果您需要与json中相同的顺序,则应像String
那样解析它,然后使用标准的String
函数以正确的顺序获取数据并将其添加到数组中。但是没有Codable
:(