파이썬  Dictionary 객체를 json.dumps() 사용시 속성 순서 고정하기
파이썬에서 key와 value 형태의 자료구조인 Dictionary 객체를 JSON 문자열로 만들시 json.dumps() 를 사용하게 됩니다. json 객체 또한 key-value 방식이므로 사실상 동일한 구조라 할 수 있습니다.
>>> import json
>>> json.dumps({'a'1'b'2})
'{"a": 1, "b": 2}'
cs


그런데 이녀석이 어떨때는 지정해준 표현식 그대로 dump 되지만 어떨때는 속성(key)의 정렬 순서가 뒤죽박죽이 됩니다.
>>> import json
>>> json.dumps({'a'1'b'2})
'{"b": 2, "a": 1}'
cs

이는 dict()함수로 직접 생성후 값을 지정해주어도 마찬가지입니다.
>>> obj = dict()
>>> obj['a'= 1
>>> obj['b'= 2
>>> json.dumps(obj)
'{"b": 2, "a": 1}'
cs


dumps()srot_keys 파라미터를 True로 주게 되면 속성의 문자를 기준으로 정렬이 되기는 하지만 목적이 아닐 수 있습니다.
json.dumps(obj, ensure_ascii=False, sort_keys=True)
cs


 

 



dump시에 속성의 순서가 고정되지 않는 원인
사실 객체에서 속성의 순서는 중요하지 않고 보장되어야 할 이유가 없습니다. 김철수라는 객체의 속성 중 age가 먼저냐 name이 먼저냐는 따질 이유가 없습니다. 다만 age가 몇살이고 name이 무엇인지의 값이 중요할 뿐이죠. 

그래서인지 python3.6 이전에는 이러한 속성의 순서를 보장하지 않는다고 합니다.(3.7버전 이전일수도 있습니다)
그러나 최신 버전의 파이썬은 순서를 보장한다고 하는군요.



해결 방법
만약 현재 자신이 사용하는 파이썬 버전이 Dictionary의 속성 순서를 보장하지 않는다면 두가지 해결 방법이 있습니다.

1. 파이썬 버전은 3.7정도로 최신버전을 사용합니다.
2. 파이썬 버전을 올리기 힘들다면 collections.OrderedDict() 를 사용합니다.


collections.OrderedDict() 사용은 다음과 같이 하면 됩니다.
import collections
 
 
obj = collections.OrderedDict({'a'1'b'2})
 
jsonData = json.dumps(obj, ensure_ascii=False, sort_keys=False)
print(jsonData)
cs

또는 다음과 같이 사용합니다.
import collections
 
 
obj = collections.OrderedDict()
obj['a'= 1
obj['b'= 2
 
 
jsonData = json.dumps(obj, ensure_ascii=False, sort_keys=False)
print(jsonData)
cs



블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!