키가 있는지 확인하고 Python을 사용하여 JSON 배열을 반복하십시오.


130

아래 게시물과 같은 Facebook 게시물의 JSON 데이터가 많이 있습니다.

{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}

JSON 데이터는 반 구조적이며 모두 동일하지 않습니다. 아래는 내 코드입니다.

import json 

str = '{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}'
data = json.loads(str)

post_id = data['id']
post_type = data['type']
print(post_id)
print(post_type)

created_time = data['created_time']
updated_time = data['updated_time']
print(created_time)
print(updated_time)

if data.get('application'):
    app_id = data['application'].get('id', 0)
    print(app_id)
else:
    print('null')

#if data.get('to'):
#... This is the part I am not sure how to do
# Since it is in the form "to": {"data":[{"id":...}]}

코드가 to_id 를 1543 으로 인쇄하고 그렇지 않으면 'null' 을 인쇄하고 싶습니다.

이 작업을 수행하는 방법을 잘 모르겠습니다.

답변:


162
import json

jsonData = """{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}"""

def getTargetIds(jsonData):
    data = json.loads(jsonData)
    if 'to' not in data:
        raise ValueError("No target in given data")
    if 'data' not in data['to']:
        raise ValueError("No data for target")

    for dest in data['to']['data']:
        if 'id' not in dest:
            continue
        targetId = dest['id']
        print("to_id:", targetId)

산출:

In [9]: getTargetIds(s)
to_id: 1543

6
왜이 명시 적 in검사와 raise누락 된 검사 입니까? 확인하지 않고 액세스하면 정확히 동일한 동작을 얻을 수 있습니다 ( KeyError대신 에을 제외하고 ValueError).
abarnert

100

원하는 모든 키가 있는지 확인하는 것입니다

h = {'a': 1}
'b' in h # returns False

키 값이 있는지 확인하려는 경우

h.get('b') # returns None

실제 값이없는 경우 기본값을 반환

h.get('b', 'Default value')

{ 'a': 1, 'b': null}의 경우 b에 대해 예상
되는대로

16

속성 유효성 검증의 논리를 변경해야 할 때마다 한 위치에 있고 팔로어가 코드를 더 읽기 쉽도록 도우미 유틸리티 메소드를 작성하는 것이 좋습니다.

예를 들어 다음에 도우미 메서드 (또는 JsonUtils정적 메서드가있는 클래스)를 만듭니다 json_utils.py.

def get_attribute(data, attribute, default_value):
    return data.get(attribute) or default_value

그런 다음 프로젝트에서 사용하십시오.

from json_utils import get_attribute

def my_cool_iteration_func(data):

    data_to = get_attribute(data, 'to', None)
    if not data_to:
        return

    data_to_data = get_attribute(data_to, 'data', [])
    for item in data_to_data:
        print('The id is: %s' % get_attribute(item, 'id', 'null'))

중요 사항:

내가 data.get(attribute) or default_value단순히 대신 사용하는 이유가 있습니다 data.get(attribute, default_value).

{'my_key': None}.get('my_key', 'nothing') # returns None
{'my_key': None}.get('my_key') or 'nothing' # returns 'nothing'

내 응용 프로그램에서 값이 'null'인 속성을 얻는 것은 속성을 전혀 얻지 않는 것과 같습니다. 사용법이 다른 경우이를 변경해야합니다.


4
jsonData = """{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}, {"name": "Joe Schmoe"}]}, "type": "status", "id": "id_7"}"""

def getTargetIds(jsonData):
    data = json.loads(jsonData)
    for dest in data['to']['data']:
        print("to_id:", dest.get('id', 'null'))

시도 해봐:

>>> getTargetIds(jsonData)
to_id: 1543
to_id: null

또는 인쇄 대신 ID가 누락 된 값을 건너 뛰려면 'null':

def getTargetIds(jsonData):
    data = json.loads(jsonData)
    for dest in data['to']['data']:
        if 'id' in to_id:
            print("to_id:", dest['id'])

그래서:

>>> getTargetIds(jsonData)
to_id: 1543

물론 실제 생활에서, 당신은 아마 print각각의 ID를 원하지 않고 , 그것들을 저장하고 그들과 무언가를하기를 원할 것입니다. 그러나 그것은 또 다른 문제입니다.



4

이 목적을 위해 작은 기능을 작성했습니다. 자유롭게 용도 변경,

def is_json_key_present(json, key):
    try:
        buf = json[key]
    except KeyError:
        return False

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