programing

Python에서의 JSON 출력 정렬

muds 2023. 3. 2. 22:44
반응형

Python에서의 JSON 출력 정렬

Python의 JSON에 문제가 있습니다.

실제로 이 코드를 실행하려고 하면 python이 정렬된 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 문자열을 정렬하지 않도록 하려면 어떻게 해야 합니까?

표준 라이브러리에서 시도합니다.

>>> 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

자신의 가치를 Python에 저장하고 있습니다.Python은 주문에 대한 개념이 전혀 없습니다.이것은 키와 값의 맵일 뿐입니다.따라서 아이템을 에 배치하면 모든 주문이 손실됩니다.values변수.

사실 결정론적 순서를 얻는 유일한 방법은sort_keys=True영숫자 순서로 정렬되어 있을 것입니다.순서가 왜 그렇게 중요하죠?

다른 곳에서 설명한 바와 같이 Ordered Dict를 사용하는 것이 대부분의 문제 해결 방법이며, Obj Dict를 사용하는 것이 더 나을 수 있습니다.

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

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

그렇지 않으면 json 파일이 정렬되어 있어도 해당 순서는 로드 시 손실됩니다.

OrderedDict 대신 'ObjDict'를 사용하는 것이 더 나은 해결책일 수 있습니다.이를 위해서는 pip install 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 객체에 나타나는 순서대로 항목을 인쇄합니다.경우에 따라서는, 디폴트의 영숫자 정렬 순서와 같은 경우가 있습니다.이 예에서는 "format"이 "request" 뒤에 오기 때문에 키가 이렇게 정렬되지도 않습니다.그럼에도 불구하고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 데이터를 정렬할 수 있습니다.

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

정렬할 필요가 없는 경우는, 다음의 정보를 제공합니다.

unsorted_json = json.dumps(values)  

또는 다음과 같이 입력합니다.

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

언급URL : https://stackoverflow.com/questions/2774361/json-output-sorting-in-python

반응형