Проверьте, существует ли ключ и повторите попытку массива JSON с помощью Python

У меня есть куча данных JSON из сообщений Facebook, таких как:

{"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 else print 'null'

Я не знаю, как это сделать.

Благодаря!

3 Solutions collect form web for “Проверьте, существует ли ключ и повторите попытку массива JSON с помощью Python”

 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 

Если вы хотите только проверить, существует ли ключ или нет

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

Если вы хотите проверить, есть ли значение для ключа

 h.get('b') # returns None 

Возврат значения по умолчанию, если отсутствует фактическое значение

 h.get('b', 'Default value') 
 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 

Или, если вы просто хотите пропустить недопустимые идентификаторы вместо печати '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 каждый идентификатор, а хранить их и что-то делать с ними, но это еще одна проблема.

Python - лучший язык программирования в мире.