JSON 객체의 항목이“json.dumps”를 사용하여 순서가 잘못 되었습니까?
나는 json.dumps
json으로 변환 하는 데 사용 하고있다.
countries.append({"id":row.id,"name":row.name,"timezone":row.timezone})
print json.dumps(countries)
내가 가진 결과는 다음과 같습니다.
[
{"timezone": 4, "id": 1, "name": "Mauritius"},
{"timezone": 2, "id": 2, "name": "France"},
{"timezone": 1, "id": 3, "name": "England"},
{"timezone": -4, "id": 4, "name": "USA"}
]
id, name, timezone 순서대로 키를 원하지만 대신 시간대, id, 이름이 있습니다.
이 문제를 어떻게 해결해야합니까?
Python dict
(Python 3.7 이전)과 JSON 객체는 모두 순서가없는 컬렉션입니다. sort_keys
키를 정렬하기 위해 매개 변수를 전달할 수 있습니다 .
>>> import json
>>> json.dumps({'a': 1, 'b': 2})
'{"b": 2, "a": 1}'
>>> json.dumps({'a': 1, 'b': 2}, sort_keys=True)
'{"a": 1, "b": 2}'
특정 주문이 필요한 경우 당신은 사용할collections.OrderedDict
수 있습니다 :
>>> from collections import OrderedDict
>>> json.dumps(OrderedDict([("a", 1), ("b", 2)]))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict([("b", 2), ("a", 1)]))
'{"b": 2, "a": 1}'
Python 3.6부터 키워드 인수 순서가 유지되고 더 좋은 구문을 사용하여 위의 내용을 다시 작성할 수 있습니다.
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
PEP 468 – 키워드 인수 순서 유지를 참조하십시오 .
귀하의 의견은 JSON으로 지정되고있는 경우, (얻을 수있는 순서를 유지하기 위해 OrderedDict
), 당신은 통과 할 수 object_pair_hook
, @Fred 얀 코스키에 의해 제안 :
>>> json.loads('{"a": 1, "b": 2}', object_pairs_hook=OrderedDict)
OrderedDict([('a', 1), ('b', 2)])
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])
다른 사람들이 언급했듯이 기본 dict은 순서가 없습니다. 그러나 파이썬에는 OrderedDict 객체가 있습니다. (최근 Python에 내장되어 있거나 http://code.activestate.com/recipes/576693/에서 사용할 수 있습니다 ).
최신 파이썬 json 구현이 내장 된 OrderedDicts를 올바르게 처리한다고 생각하지만 확실하지 않습니다 (테스트에 쉽게 액세스 할 수 없습니다).
오래된 pythons simplejson 구현은 OrderedDict 객체를 잘 처리하지 못하고 출력하기 전에 일반 dict로 변환합니다.
class OrderedJsonEncoder( simplejson.JSONEncoder ):
def encode(self,o):
if isinstance(o,OrderedDict.OrderedDict):
return "{" + ",".join( [ self.encode(k)+":"+self.encode(v) for (k,v) in o.iteritems() ] ) + "}"
else:
return simplejson.JSONEncoder.encode(self, o)
이제 이것을 사용하여 다음을 얻습니다.
>>> import OrderedDict
>>> unordered={"id":123,"name":"a_name","timezone":"tz"}
>>> ordered = OrderedDict.OrderedDict( [("id",123), ("name","a_name"), ("timezone","tz")] )
>>> e = OrderedJsonEncoder()
>>> print e.encode( unordered )
{"timezone": "tz", "id": 123, "name": "a_name"}
>>> print e.encode( ordered )
{"id":123,"name":"a_name","timezone":"tz"}
어느 것이 원하는대로입니다.
Another alternative would be to specialise the encoder to directly use your row class, and then you'd not need any intermediate dict or UnorderedDict.
The order of a dictionary doesn't have any relationship to the order it was defined in. This is true of all dictionaries, not just those turned into JSON.
>>> {"b": 1, "a": 2}
{'a': 2, 'b': 1}
Indeed, the dictionary was turned "upside down" before it even reached json.dumps
:
>>> {"id":1,"name":"David","timezone":3}
{'timezone': 3, 'id': 1, 'name': 'David'}
in JSON, as in Javascript, order of object keys is meaningless, so it really doesn't matter what order they're displayed in, it is the same object.
json.dump() will preserve the ordder of your dictionary. Open the file in a text editor and you will see. It will preserve the order regardless of whether you send it an OrderedDict.
But json.load() will lose the order of the saved object unless you tell it to load into an OrderedDict(), which is done with the object_pairs_hook parameter as J.F.Sebastian instructed above.
It would otherwise lose the order because under usual operation, it loads the saved dictionary object into a regular dict and a regular dict does not preserve the oder of the items it is given.
hey i know it is so late for this answer but add sort_keys and assign false to it as follows :
json.dumps({'****': ***},sort_keys=False)
this worked for me
참고URL : https://stackoverflow.com/questions/10844064/items-in-json-object-are-out-of-order-using-json-dumps
'development' 카테고리의 다른 글
장고 필터 대 단일 객체 얻기? (0) | 2020.06.28 |
---|---|
요소에 공백이있는 배쉬 배열 (0) | 2020.06.28 |
영문자와 만 일치하는 정규식 (0) | 2020.06.28 |
Windows 서비스로서의 .NET 콘솔 어플리케이션 (0) | 2020.06.28 |
jQuery“속성이없는”선택기? (0) | 2020.06.28 |