반응형
json.dumps를 사용할 때 python dict의 int 키가 문자열로 바뀌는 이유는 무엇입니까?
이 변환표에 따르면 Python ints는 JSON 모듈을 사용하여 시리얼화되면 JSON 번호로 작성됩니다.기대했던 대로입니다.
정수 키와 정수 값을 가진 사전이 있습니다.
>>> d = {1:2}
>>> type(d.items()[0][0])
<type 'int'>
>>> type(d.items()[0][1])
<type 'int'>
json 모듈을 사용하여 이것을 JSON 문자열로 시리얼화하면 값은 숫자로 쓰이지만 키는 문자열로 쓰입니다.
>>> json.dumps(d)
'{"1": 2}'
이것은 제가 원하는 동작이 아닙니다.또한 json.dumps/json.loads 라운드 트립이 깨지기 때문에 특별히 망가진 것 같습니다.
>>> d == json.loads(json.dumps(d))
False
왜 이런 일이 일어나는지, 키를 강제로 숫자로 쓸 수 있는 방법이 있나요?
단순한 이유는 JSON이 정수 키를 허용하지 않기 때문입니다.
object
{}
{ members }
members
pair
pair , members
pair
string : value # Keys *must* be strings.
이 제한을 회피하는 방법에 대해서는 먼저 수신측 실장이 기술적으로 무효인 JSON을 처리할 수 있는지 확인해야 합니다.그런 다음 따옴표를 모두 바꾸거나 커스텀시리얼라이저를 사용할 수 있습니다.
필요한 경우 다음을 사용하여 키를 다시 정수로 변환할 수 있는지 확인할 수 있습니다.
def pythonify(json_data):
for key, value in json_data.iteritems():
if isinstance(value, list):
value = [ pythonify(item) if isinstance(item, dict) else item for item in value ]
elif isinstance(value, dict):
value = pythonify(value)
try:
newkey = int(key)
del json_data[key]
key = newkey
except TypeError:
pass
json_data[key] = value
return json_data
이 함수는 가능한 경우 모든 문자열 키를 int-key에 재귀적으로 캐스트합니다.가능하지 않은 경우 키 유형은 변경되지 않습니다.
아래 JLT의 예를 조금 수정했습니다.내 거대한 네스트 사전에서 그 코드는 사전의 크기를 바꾸고 예외로 끝납니다.어쨌든, JLT는 신용이야!
def pythonify(json_data):
correctedDict = {}
for key, value in json_data.items():
if isinstance(value, list):
value = [pythonify(item) if isinstance(item, dict) else item for item in value]
elif isinstance(value, dict):
value = pythonify(value)
try:
key = int(key)
except Exception as ex:
pass
correctedDict[key] = value
return correctedDict
언급URL : https://stackoverflow.com/questions/17099556/why-do-int-keys-of-a-python-dict-turn-into-strings-when-using-json-dumps
반응형
'programing' 카테고리의 다른 글
중력은 성공적인 형태 제출 시 화재 이벤트를 형성합니다. (0) | 2023.02.26 |
---|---|
강제 JSONNET: DateTime을 시리얼화할 때 밀리초 포함(ms 구성 요소가 0인 경우에도) (0) | 2023.02.26 |
AngularJS: 컨트롤러와 공장/서비스는 어떻게 풍부하고 계층적인 객체 모델을 사용하여 구조화해야 합니까? (0) | 2023.02.26 |
IE8에서 각도 $q.catch() 메서드가 실패함 (0) | 2023.02.26 |
각도 ng-참이 아닌 경우 (0) | 2023.02.26 |