JSONDecoder изменяет порядок элементов [дубликат]

Консенсус заключается в использовании словаря для этого - см. другие ответы. Это хорошая идея для большинства случаев, однако есть много аспектов, связанных с этим:

  • вы сами будете нести ответственность за этот словарь, включая сбор мусора (из переменных in-dict) и т. Д. .
  • нет никакой локальности или глобальности для переменных переменных, это зависит от глобальности словаря
  • , если вы хотите переименовать имя переменной, вам придется сделать это вручную
  • однако вы гораздо более гибкие, например вы можете решить перезаписать существующие переменные или ... ... выбрать реализацию константных переменных для создания исключения при перезаписи для разных типов и т. д.

Тем не менее, я реализовал variable variables manager -класс, который предоставляет некоторые из вышеперечисленных идей. Он работает для python 2 и 3.

Вы использовали бы класс следующим образом:

from variableVariablesManager import VariableVariablesManager

myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])

# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
    myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
    print("not allowed")
except AttributeError as e:
    pass

# rename a variable
myVars.renameVariable('myconst', 'myconstOther')

# preserve locality
def testLocalVar():
    myVars = VariableVariablesManager()
    myVars['test'] = 13
    print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])

# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
    myVars = VariableVariablesManager()
    print("inside function myVars['globalVar']:", myVars['globalVar'])
    myVars['globalVar'] = 13
    print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])

Если вы хотите разрешить переписывание переменных с помощью только тот же тип:

myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)

1
задан Paul Cezanne 27 June 2015 в 13:51
поделиться

2 ответа

Опубликовать то, что уже было сказано в комментариях: Словари - это «неупорядоченные коллекции». Они не имеют никакого порядка для своих пар ключ / значение. Период.

Если вы хотите упорядоченную коллекцию, используйте что-то другое, кроме словаря. (массив однотипных словарей - это один из способов сделать это.) Вы также можете написать код, который загружает ключи словаря в изменяемый массив, сортирует массив, а затем использует отсортированный массив ключей для выбора пар ключ / значение в желаемый порядок.

Вы также можете создать свой собственный тип коллекции, который использует строки как индексы и сохраняет элементы в отсортированном порядке. Swift делает это просто, хотя это будет дорого стоить.

5
ответ дан Duncan C 21 August 2018 в 06:06
поделиться
  • 1
    Благодарим вас за разработку – KML 27 June 2015 в 14:19
  • 2
    Загрузка ключей словаря в массив и сортировка - это не способ решить эту проблему. Потому что во многих случаях нам нужно заказывать без какой-либо логики, просто я хочу иметь такой массив: c,d,a,e. Таким образом, единственный способ - установить последовательность, массив json, чтобы заметить, что это тот порядок, который я хотел. Это так раздражает. На каком-то языке у них нет этой проблемы. Например, это PHP. – TomSawyer 12 July 2016 в 21:14
  • 3
    @TomSawyer, разные языки предлагают различные функции в своих типах коллекций и делают разные компромиссы между дизайнами. В Swift, Objective-C и ряде других языков тип словаря неупорядочен. PHP - это слабо типизированный, интерпретируемый язык, а производительность его типа словаря / списка, вероятно, на пару порядков меньше медленнее, чем Swift. – Duncan C 13 July 2016 в 02:16
  • 4
    Я знаю, это разница между языками. Не говорите о производительности, говорите об удобстве. В этом конкретном случае нам нужно переписать API для возврата подходящих json-данных только для Swift. Я искал словарь с одним товаром с помощью Swift, но ничего не могу найти. Может использовать тип OrderedDictionary, но бесполезно работать с json, потому что мы должны сначала заказать словарь. – TomSawyer 13 July 2016 в 06:32
  • 5
    Поэтому используйте массив. – Duncan C 13 July 2016 в 13:25

Мне это понравилось.

 let stagesDict = NSDictionary()
 if let strVal = sleepItemDict["stages"] as? NSDictionary {
 stagesDict = strVal
let sortedKeys = (stagesDict.allKeys as! [String]).sorted(by: <) 
 var sortedValues : [Int] = []
  for key in sortedKeys {
     let value = stagesDict[key]!
      print("\(key): \(value)")
      sortedValues.append(value as! Int)
    }
}
0
ответ дан Chandramani 21 August 2018 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: