Декодируйте json в том же порядке, в котором он был получен с сервера, используя протокол Codable.

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

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

Но можно ли как-то поддерживать порядок??


person arinjay    schedule 15.04.2019    source источник
comment
Если порядок важен, это должен быть массив. В противном случае у вас возникнут проблемы с таким JSON на большинстве языков.   -  person Sulthan    schedule 16.11.2019
comment
Возможно, это может помочь или это   -  person Joakim Danielson    schedule 16.11.2019


Ответы (2)


Dictionary - это неупорядоченная коллекция в Swift. Если вам нужен тот же порядок, что и в json, вы должны разобрать его как String, а затем получить данные с правильным порядком, используя стандартные функции String, и добавить их в массив. Но без Codable :(

person I. Pedan    schedule 16.11.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)

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

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

person Darshan Kunjadiya    schedule 15.04.2019
comment
Сортировка словаря в алфавитном порядке — это не то же самое, что сохранение исходного порядка. - person Sulthan; 16.11.2019