programing

JSON을 Ordered Dict에 로드할 수 있습니까?

coolbiz 2022. 11. 3. 22:54
반응형

JSON을 Ordered Dict에 로드할 수 있습니까?

Ordered Dict를 사용할 수 있습니다.json.dump즉, Ordered Dict는 JSON에 대한 입력으로 사용할 수 있습니다.

하지만 출력으로 사용할 수 있을까요?만약 그렇다면, 어떻게?저 같은 경우에는load파일의 키 순서를 유지할 수 있도록 OrderedDict로 변환합니다.

그렇지 않은 경우 해결 방법이 있습니까?

네, 가능합니다.를 지정함으로써object_pairs_hookJSONDecoder에 대한 인수입니다.실제로 이것은 설명서에 나와 있는 정확한 예입니다.

>>> json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode('{"foo":1, "bar": 2}')
OrderedDict([('foo', 1), ('bar', 2)])
>>> 

이 파라미터를 다음에 전달할 수 있습니다.json.loads(다른 용도로 디코더 인스턴스가 필요하지 않은 경우) 다음과 같이 하십시오.

>>> import json
>>> from collections import OrderedDict
>>> data = json.loads('{"foo":1, "bar": 2}', object_pairs_hook=OrderedDict)
>>> print json.dumps(data, indent=4)
{
    "foo": 1,
    "bar": 2
}
>>> 

사용.json.load같은 방법으로 행해집니다.

>>> data = json.load(open('config.json'), object_pairs_hook=OrderedDict)

Python 2.7+용 간이 버전

my_ordered_dict = json.loads(json_str, object_pairs_hook=collections.OrderedDict)

또는 Python 2.4~2.6의 경우

import simplejson as json
import ordereddict

my_ordered_dict = json.loads(json_str, object_pairs_hook=ordereddict.OrderedDict)

좋은 소식이야!버전 3.6 이후 cPython 구현에서는 사전 삽입 순서가 유지되고 있습니다(https://mail.python.org/pipermail/python-dev/2016-September/146327.html)).즉, 현재 json 라이브러리가 기본적으로 오더 보존 상태임을 의미합니다.python 3.5와 3.6의 동작 차이를 관찰합니다.코드:

import json
data = json.loads('{"foo":1, "bar":2, "fiddle":{"bar":2, "foo":1}}')
print(json.dumps(data, indent=4))

py3.5에서는 결과 순서가 정의되지 않습니다.

{
    "fiddle": {
        "bar": 2,
        "foo": 1
    },
    "bar": 2,
    "foo": 1
}

python 3.6의 cPython 구현에서는 다음과 같이 합니다.

{
    "foo": 1,
    "bar": 2,
    "fiddle": {
        "bar": 2,
        "foo": 1
    }
}

정말 좋은 소식은 이것이 python 3.7에서 언어 사양이 되었다는 것입니다(cPython 3.6+의 구현 세부사항과는 반대). https://mail.python.org/pipermail/python-dev/2017-December/151283.html

이제 질문에 대한 답변은 python 3.6으로 업그레이드! :)입니다.

언제든지 dict를 덤프하는 것 외에 키 목록을 쓰고 나서OrderedDict목록을 반복하는 것만으로요?

사전과 함께 정렬된 키 목록을 덤프하는 것 외에 명시적인 장점이 있는 또 다른 로우테크 솔루션은 키와 값 쌍의 정렬된 목록을 덤프하는 것입니다.ordered_dict.items(); 로드는 간단합니다.OrderedDict(<list of key-value pairs>)JSON에는 이 개념이 없지만(JSON 딕셔너리에는 순서가 없습니다).

라는 사실을 이용하는 것은 정말 좋은 일이다.json는 OrderedDict를 올바른 순서로 덤프합니다.단, 일반적으로는 불필요하게 무겁고 모든 JSON 사전을 OrderedDict로 읽어야 하는 것은 의미가 없습니다.object_pairs_hookarguments)를 사용하여 정렬해야 하는 사전만 명시적으로 변환하는 것도 의미가 있습니다.

object_pairs_hook 파라미터를 지정하면 통상 사용되는 load 명령어가 기능합니다.

import json
from  collections import OrderedDict
with open('foo.json', 'r') as fp:
    metrics_types = json.load(fp, object_pairs_hook=OrderedDict)

언급URL : https://stackoverflow.com/questions/6921699/can-i-get-json-to-load-into-an-ordereddict

반응형