programing

json.dumps를 사용할 때 python dict의 int 키가 문자열로 바뀌는 이유는 무엇입니까?

instargram 2023. 2. 26. 09:01
반응형

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

반응형