IT TIP

Python에서 JSON 출력 정렬

itqueen 2020. 12. 13. 11:38
반응형

Python에서 JSON 출력 정렬


파이썬에서 JSON에 문제가 있습니다.

실제로이 코드를 실행하려고하면 파이썬이 정렬 된 JSON 문자열을 제공합니다!

예를 들면 :

values = {'profile' : 'testprofile', 
          'format': 'RSA_RC4_Sealed', 
          'enc_key' : base64.b64encode(chiave_da_inviare), 
          'request' : base64.b64encode(data)
      }


values_json = json.dumps(values, sort_keys=False, separators=(',', ':'))

그리고 이것은 출력입니다.

{"profile":"testprofile","enc_key":"GBWo[...]NV6w==","request":"TFl[...]uYw==","format":"RSA_RC4_Sealed"}

보시다시피 "sort_keys = False"를 사용하려고했지만 아무것도 바뀌지 않았습니다.

Python에서 JSON 문자열 정렬을 중지하려면 어떻게해야합니까?


당신은 순서에 대한 내재적 개념이 전혀없는 python dict에 값을 저장하고 있습니다 . 그것은 단지 키 => 값 맵일뿐입니다. 따라서 항목을 "값"변수에 배치하면 항목이 모든 순서를 잃게됩니다.

사실 결정 론적 순서를 얻는 유일한 방법은 "sort_keys = True"를 사용하는 것입니다. 나는 영숫자 순서로 배치한다고 가정합니다. 순서가 왜 그렇게 중요합니까?


OrderedDict표준 라이브러리에서 시도하십시오 collections.

>>> import json
>>> from collections import OrderedDict
>>> values = OrderedDict([('profile','testprofile'), 
                          ('format', 'RSA_RC4_Sealed'), 
                          ('enc_key', '...'), 
                          ('request', '...')])
>>> json.dumps(values, sort_keys=False)
'{"profile": "testprofile", "format": "RSA_RC4_Sealed", "enc_key": "...", "request": "..."}'

불행하게도이 기능은 New in version 2.7대한collections


다른 곳에서 논의 된 OrderedDict는 문제에 대한 대부분의 해결책이며 'ObjDict'가 더 좋을 수 있습니다.

그러나로드시 순서를 유지해야하는 경우 값을 OrderedDict에로드하기 위해 json.loads ()도 필요합니다. 이 사용을 수행하려면

from collections import OrderedDict
values=json.loads(jsontext,object_pairs_hook=OrderedDict)

그렇지 않으면 json 파일이 순서대로되어 있어도로드 될 때 해당 순서가 손실됩니다.

아마도 더 나은 해결책은 OrderedDict 대신 'ObjDict'를 사용하는 것입니다. 이를 위해서는 pip 설치 objdict가 필요합니다. ObjDict는 OrderedDict와 마찬가지로 여전히 순서를 유지하지만 JSON 지원과이 예제의 더 나은 처리를 제공합니다.

from objdict import ObjDict
values = ObjDict("""{"profile" : "testprofile",
      "format": "RSA_RC4_Sealed" }""")
values.enc_key = base64.b64encode(chiave_da_inviare)
values.request = base64.b64encode(data)

values_json = values.dumps(separators=(',', ':'))

지정 sort_keys=False하면 Python은 기본 Python dict 객체에 나타나는 순서대로 항목을 인쇄합니다. 경우에 따라 이것은 기본 영숫자 정렬 순서와 동일 할 수 있습니다. 귀하의 예에서 "형식"은 "요청"뒤에 오기 때문에 키는 그렇게 정렬되지 않았습니다. 그럼에도 불구 sort_keys하고이 샘플 코드에서 알 수 있듯이 매개 변수는 여전히 유효합니다.

>>> import json
>>> json.dumps({"a":5, "b":6, "c":7}, sort_keys=False)
'{"a": 5, "c": 7, "b": 6}'

키는 "profile", "enc_key", "request", "format"으로 정렬되지 않습니다.

사전에 만든 것과 동일한 순서로 나타나기를 원하는 것처럼 들리지만 사전은 본질적으로 정렬되지 않고 키를 삽입 한 순서를 기억하지 못합니다.

사용할 수있는 SortedDict 구현이 많이 있지만 json 인코더는 원하는 순서로 키를 가져 오는 데이를 사용하는 것을 알지 못합니다.


간단한 json.dumps를 사용하여 json 데이터를 정렬 할 수 있습니다.

sotred_json = json.dumps(values, sort_keys=True)

정렬 할 필요가 없으면 간단히 제공

unsotred_json = json.dumps(values)  

또는:

unsotred_json = json.dumps(values, sort_keys=False)

참고 URL : https://stackoverflow.com/questions/2774361/json-output-sorting-in-python

반응형