Вопрос по json, python – Как преобразовать строку json в словарь и сохранить порядок в ключах? [Дубликат]

8

This question already has an answer here:

Can I get JSON to load into an OrderedDict? 6 answers

У меня проблема, когда я хочу преобразовать строку JSON в словарь Python. У меня есть строка как

 s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....}

когда я пишу что-то вроде

tags=json.loads(s)

Я получаю словарь, но порядок ключей не такой, как в строке (это не имя, цена ...). Как преобразовать строку json в словарь и сохранить порядок в ключах?

Я думаюthis previous Здесь вопрос на Stackoverflow дает ответ. Alvin
На самом деле не существует такой вещи, как «порядок ключей». вdict, Вы можете перебирать их по одному, но нет никакого контроля над тем, в каком порядке вы их вводите. Karl Knechtel
Словари Python неупорядочены, и это нормально, потому что обычно вы получаете доступ к записямby key и если вам приходится перебирать элементы, порядок обычно не имеет значения. Btw,s не является ни строкой, ни словарем, не допустимым JSON, если это была строка. Похоже, что вы за другой структурой, такой как массив объектов:[{"name": "...", "price": "..."}, ...], Если вы предоставите некоторые объяснения дляwhy вам нужны ключи для того, чтобы привести правильный пример, и мы поможем вам лучше. Felix Kling

Ваш Ответ

1   ответ
22

Python 2.7 у тебя естьOrderedDict модуль изcollections

Этот вид словаря сохраняет порядок вставки элементов.

Из документов Python:

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Deserialize fp (a .read()-supporting file-like object containing a JSON document) to a Python object.

If the contents of fp are encoded with an ASCII based encoding other than UTF-8 (e.g. latin-1), then an appropriate encoding name must be specified. Encodings that are not ASCII based (such as UCS-2) are not allowed, and should be wrapped with codecs.getreader(encoding)(fp), or simply decoded to a unicode object and passed to loads().

object_hook is an optional function that will be called with the result of any object literal decoded (a dict). The return value of object_hook will be used instead of the dict. This feature can be used to implement custom decoders (e.g. JSON-RPC class hinting).

object_pairs_hook is an optional function that will be called with the result of any object literal decoded with an ordered list of pairs. The return value of object_pairs_hook will be used instead of the dict. This feature can be used to implement custom decoders that rely on the order that the key and value pairs are decoded (for example, collections.OrderedDict() will remember the order of insertion). If object_hook is also defined, the object_pairs_hook takes priority.

Я думаю, что вы могли бы использовать параметр object_pairs_hook сcollections.OrderedDict()

tags=json.loads(s, object_pairs_hook=collections.OrderedDict)
спас мой день ...

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