파이썬으로 JSON 객체를 동적으로 빌드하는 방법은 무엇입니까?


274

저는 Python을 처음 사용하고 JSON 데이터를 가지고 놀고 있습니다. 기존 JSON 객체에 키-값을 추가하여 JSON 객체를 동적으로 작성하고 싶습니다.

나는 다음을 시도했지만 얻는다 TypeError: 'str' object does not support item assignment:

import json

json_data = json.dumps({})
json_data["key"] = "value"

print 'JSON: ', json_data

답변:


553

JSON 문자열로 인코딩 하기 전에 객체 빌드 합니다.

import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

JSON은 구조를 나타내는 텍스트 형식 의 직렬화 형식 입니다. 그 자체는 그 구조가 아닙니다.


2
귀하의 솔루션은 저에게 매력처럼 작용했습니다. 그래도 마지막 줄의 의미를 이해할 수 없었습니다. 조금 더 자세히 설명해 주시겠습니까? 감사.
akki

6
@akki : OP는 JSON 문자열 (개체를 인코딩하는 일련의 문자)을 개체 자체로 처리하려고했습니다. 그들은 파이썬 사전이 아니기 json_data['key'] = 'value'때문에 작동하지 않는 을 사용하려고했습니다 json_data.
Martijn Pieters

주어진 객체가 어떻게 든 자동으로 객체를 JSON 또는 사전으로 변환 할 수 있습니까?
Charlie Parker

@CharlieParker : 너무 넓습니다. JSON은 소수의 데이터 유형으로 제한된 형식이므로 Python 객체는 단순히 JSON에 반영되지 않습니다. 여기에 Django 또는 SQLAlchemy 모델 등과 같은 특정 객체 유형과 JSON 을 다루는 SO에 대한 많은 질문이 있습니다 .
Martijn Pieters

1
@AlexJohnson : pip list동일한 정보를 제공하고 JSON을 출력 할 수 있습니다.pip list --format=json
Martijn Pieters

24

파이썬 사전을 만들어 한 줄에 JSON으로 직렬화 할 수 있으며 추악하지도 않습니다.

my_json_string = json.dumps({'key1': val1, 'key2': val2})

21

사전 (또는 더 복잡한 데이터의 경우 중첩 된 사전)을 구축 할 수있는 솔루션이 이미 제공되어 있지만 객체를 만들려면 'ObjDict'를 사용해보십시오. 이를 통해 json을 생성 (예 : 순서 유지) 할 수 있도록 제어 할 수 있으며 개념을 선호하는 객체로 빌드 할 수 있습니다.

pip install objdict를 먼저 사용하십시오.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()

2
이것이 바로 내가 찾던 것입니다! dicts가 정렬되지 않은 경우, json.dumpsie를 호출 할 때 알파벳 순서로 정렬 할 수 json.dumps(response, sort_keys=True, indent=4)있지만 원하는 순서, 그룹화 및 표현이 아닌 알파벳 순서로
Jonathan

11

EasyDict라이브러리 ( doc )를 사용할 수 있습니다 .

EasyDict를 사용하면 dict 값을 속성으로 액세스 할 수 있습니다 (재귀 적으로 작동). 파이썬 딕트에 대한 자바 스크립트와 유사한 속성 점 표기법.

사용

>>> from easydict import EasyDict as edict
>>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> d.foo
3
>>> d.bar.x
1

>>> d = edict(foo=3)
>>> d.foo
3

[ 설치 ] :

  • pip install easydict

Benyamin, JSON 덤프 및로드 사용을 표시하도록 예제를 편집 할 수 있습니까?
Thom Ives

7

이전의 모든 대답은 정확합니다. 여기에 또 하나의 쉬운 방법이 있습니다. 예를 들어 Dict 데이터 구조를 만들어 개체를 직렬화하고 역 직렬화합니다.

( 공지 사항 없음 파이썬에서 널없고 나는 의도적으로 당신이 널 (null)을 저장할 수있는 방법을 보여줍니다 및 JSON 널 (null)로 변환이 사용하고 있습니다)

import json
print('serialization')
myDictObj = { "name":"John", "age":30, "car":None }
##convert object to json
serialized= json.dumps(myDictObj, sort_keys=True, indent=3)
print(serialized)
## now we are gonna convert json to object
deserialization=json.loads(serialized)
print(deserialization)

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.