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.