Расшифруйте json в том же порядке, в котором он был получен с сервера, используя протокол Codable - PullRequest
0 голосов
/ 15 апреля 2019

Итак, я анализирую свой JSON в объект, используя кодируемый протокол.Сейчас я сталкиваюсь с тем, что порядок получения json не совпадает с порядком, в котором он был декодирован в объекте.т.е. порядок клавиш не соответствует json.

Я знаю, что это не ограничение Swift.Словари Swift и JSON неупорядочены.Формат JSON не гарантирует порядок ключей, и, как таковой, не требует, чтобы парсеры сохраняли порядок

Но есть ли способ сохранить порядок ??

1 Ответ

1 голос
/ 15 апреля 2019

Добавьте 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)

Этот код отсортирует ваш словарь в алфавитном порядке.

Надеюсь, это работает для вас.

...