Python을 사용하여 JSON 문자열을 dict로 변환


415

파이썬에서 JSON과 약간 혼동됩니다. 나에게 그것은 사전처럼 보이고, 그런 이유로 나는 그것을하려고합니다.

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

그러나 내가 할 때 print dict(json)오류가 발생합니다.

이 문자열을 구조로 변환 한 다음 json["title"]"예제 용어집"을 얻기 위해 호출 하려면 어떻게해야합니까?

답변:


756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']

9
json.load와 json.loads의 차이점은 무엇입니까?
Shivam Agrawal

5
@ShivamAgrawal : 주석에 정확히 나와 있습니다.
이그나시오 바스케스-아 브람스

64
@ShivamAgrawal : 차이점은 .load()파일 객체 를 파싱한다는 것입니다. .loads()문자열 / 유니 코드 객체를 구문 분석합니다.
fyngyrz

1
이 함수의 작성자는 전달할 데이터에 대해 유형 검사를 수행하여 호출 할 올바른 함수를 자동으로 선택하기 위해 랩퍼 함수를 ​​작성하지 않았다고 귀찮게합니다. 나는 또한 사용 된 모호한 명명법을 좋아하지 않습니다. 이 문제를 해결하기 위해 내가 쓴 내용은 다음과 같습니다. def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) 개선 될 수 있다고 확신하지만 지금은 d = read_json(j)'son'또는 'file'을 호출 할 수 있습니다 .
Jacques Mathieu

2
@JacquesMathieu, Hi Jacques, 귀하의 기능에 대한 고맙게도, 때로는 사전을 사용하기 때문에 약간의 개선이 이루어졌습니다. (str (type (json_data)) == "<class '_io.TextIOWrapper'>") : # 파일의 경우 json.load (json_data) elif (type (json_data) == dict)를 반환합니다 : # 사전의 경우 json.loads를 반환합니다. (json.dumps (json_data))
Gabriel Aizcorbe 2016 년

98

json을 사용하기 시작했을 때 혼란스러워 한동안 알아낼 수 없었지만 마침내 원하는 것을 얻었습니다.
여기에 간단한 해결책이 있습니다.

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])

왜 먼저 덤프 (m)합니까?
한 반 팜

직렬화 및 역 직렬화를 설명하는 데 사용했습니다. loads(..)on '{"id": 2, "name": "hussain"}'을 사용 하는 것도 허용 된 답변과 비슷해야합니다.
Hussain

1
덤프와로드는 나에게 완벽하게 작동하지만, 받아 들여진 대답은 그렇지 않습니다. 저를 저장해 주신 @Hussain에게 감사드립니다. utf-8 인코딩으로 동적 문자열에서 time노력하고 loads있습니다 ...
Mohammed Sufian

19

속도 향상을 위해 simplejson 또는 cjson 사용

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

데이터 소스를 신뢰하는 경우 eval문자열을 사전으로 변환 하는 데 사용할 수 있습니다 .

eval(your_json_format_string)

예:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>

1
예제의 문자열이 JSON이 아닙니다.
bfontaine

1
진실. JSON으로 쉽게로드 / 덤핑 할 수있는 사전 tho로 회피됩니다 (물론 사전에 json 값이 없으면 사용자 정의 json 인코더 기능이 필요할 수 있음).
kakhkAtion

3
아니요 . 입력 데이터를 코드로 평가 해서는 안됩니다 . 이것은 신뢰할 수있는 데이터를 사용하는 작은 프로젝트 일 수 있지만 잘못된 코드는 재사용 할 수 있고 실제 프로젝트에서는 잘못된 관행을 반복하여 큰 보안 코드를 남길 수 있습니다.
NetworkMeister

그렇기 때문에 제 대답이 "데이터 소스를 신뢰하는 경우"로 시작하는 것입니다! 그러나 사실 이것은 해킹에 지나지 않으며 최선의 방법은 아닙니다.
kakhkAtion

자신의 데이터 소스라면 완전히 신뢰할 수 있습니다. 이것은 실제로 문자열 화 된 JS 객체를 dic로 변환하고 적절한 JSON 문자열로 변환하는 데 유용합니다.
Vadorequest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.