使用Codable协议以与从服务器接收到的顺序相同的顺序解码json

时间:2019-04-15 06:19:33

标签: ios swift4 codable decodable

所以我正在使用可编码协议将JSON解析为一个对象。 我现在面临的是,接收json的顺序与在对象中对其进行解码后的顺序不同。即密钥顺序不符合json。

我知道这不是Swift的限制。 Swift和JSON字典都是无序的。 JSON格式不能保证键顺序,因此不需要解析器来保留顺序

但是有什么办法可以维持订单?

2 个答案:

答案 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:(