JSON을 Ordered Dict에 로드할 수 있습니까?
Ordered Dict를 사용할 수 있습니다.json.dump
즉, Ordered Dict는 JSON에 대한 입력으로 사용할 수 있습니다.
하지만 출력으로 사용할 수 있을까요?만약 그렇다면, 어떻게?저 같은 경우에는load
파일의 키 순서를 유지할 수 있도록 OrderedDict로 변환합니다.
그렇지 않은 경우 해결 방법이 있습니까?
네, 가능합니다.를 지정함으로써object_pairs_hook
JSONDecoder에 대한 인수입니다.실제로 이것은 설명서에 나와 있는 정확한 예입니다.
>>> 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_hook
arguments)를 사용하여 정렬해야 하는 사전만 명시적으로 변환하는 것도 의미가 있습니다.
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
'programing' 카테고리의 다른 글
Mysql Server 5 vs 6 vs MariaDB (0) | 2022.11.03 |
---|---|
나사산이 손실된 경우 테이블 잠금 해제 (0) | 2022.11.03 |
클래스 메서드를 콜백으로 사용하는 방법 (0) | 2022.11.03 |
MySQL에서 예약된 단어를 테이블 또는 열 이름으로 사용하여 구문 오류가 발생했습니다. (0) | 2022.11.03 |
열을 Base64에서 문자열로 업데이트(SQL 네이티브) (0) | 2022.11.03 |