파이썬에서 JSON을 파싱하는 방법?


282

내 프로젝트는 현재 파이썬으로 JSON 메시지를 받고 있으며 약간의 정보를 얻어야합니다. 이를 위해 문자열에서 간단한 JSON으로 설정하십시오.

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

지금까지 목록을 사용하여 JSON 요청을 생성 한 다음 json.dumps반대의 작업을 수행하려면을 사용해야한다고 생각합니다 json.loads. 그러나 나는 그다지 운이 없었습니다. 누구든지 위의 예제에서 "2"입력 한 내용을 반환하는 스 니펫을 제공 할 수 "two"있습니까?


8
참고 : '작은 따옴표 문자열 구분 기호 를 사용하는 데이터가있는 사람들 은 실수로 Python 사전에 대한 문자열 표현을 만들었을 수 있습니다. JSON은 항상 "구분자를 사용 합니다. 그렇다면, 그 출력을 사용하는 생산 코드 수리 json.dumps()대신 str()하거나 repr(),하고 이상 머리를 사전에 사전의 String 표현을 변환을? 파이썬 데이터를 복구하는 방법을 알아낼 수 있습니다. 다른 힌트는 파이썬 리터럴이 있습니까? 를 찾아 None, True또는 False, JSON을 사용합니다 null, true& false.
Martijn Pieters

jsonStr이 없지만 사전 목록 ( '작은 따옴표 문자열 구분 기호 포함)이있는 사용자도 여기를 살펴보십시오. stackoverflow.com/questions/41168558/…
Lorenz

답변:


493

매우 간단합니다 :

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

또한 더 나은 성능이 필요한 경우 simplejson을 살펴보십시오 . 최신 버전은 읽기 및 쓰기를 크게 향상시키는 최적화 기능을 제공합니다.
unode

2
실제로 simplejson을 이미 사용하고 import simplejson as json있습니다. 언급을 잊었지만 감사합니다 :)
ingh.am

알았다. 사용 되었습니까 .load대신 방법.loads
선일 쿠마르

85

때로는 json이 문자열이 아닙니다. 예를 들어 다음과 같이 URL에서 json을 얻는 경우 :

j = urllib2.urlopen('http://site.com/data.json')

json.loads가 아닌 json.load를 사용해야합니다.

j_obj = json.load(j)

(잊기 쉽다 : 's'는 'string'입니다)


j.read ()를 호출하여 문자열 내용을 가져온 다음 loads 메소드를 사용할 수 있음을 추가하십시오. 이 경우에는 어떤 방법이 load () 메서드는 .read ()를 호출을 담당
rkachach

51

URL 또는 파일의 경우을 사용하십시오 json.load(). .json 컨텐츠가 포함 된 문자열의 경우을 사용하십시오 json.loads().

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

다음은 도움이 될 수있는 간단한 예입니다.

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

위 코드의 출력은 다음과 같습니다.

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

덤프의 ident 인수를 설정하여 인쇄 할 수 있습니다 (예 : print json.dumps (data, indent = 4) 사용시).

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

json 또는 ast python 모듈을 사용할 수 있습니다.

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
당신은 사용할 수 없습니다 ast.literal_eval()당신 때문에 당신의 사소한 텍스트와 정수 전용 예 이상, JSON에 대한 기능을 문제로 실행합니다. JSON은 Python이 아닙니다 . 그냥 때문에 일부 JSON과 함께 구문 분석 할 수있는 ast.literal_eval()적절한 접근 방식 있는지 확인하지 않습니다.
Martijn Pieters

1
예를 들어, null, 부울 값 및 단일 BMP가 아닌 코드 포인트가 포함되어 있으므로를 r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'사용하여 구문 분석 할 수 없습니다 ast.literal_eval(). JSON은 해당 값을 Python 리터럴이 표시하는 방식과 다르게 나타냅니다. json.loads()반면에, 그 입력에 아무 문제가 없습니다 제대로 디코딩 그것 {'foo': None, 'bar': True, 'baz': '🤦'}.
마티 피에 터스

1
다음 ast.literal_eval()으로 상당히 느리고 사용자 정의 할 수 없습니다. JSON 디코딩에 사용 해서는 안됩니다 .
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.