Tengo un montón de datos JSON de publicaciones de Facebook como el siguiente:
{"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"}
Los datos JSON están semiestructurados y no todo es lo mismo. Debajo está mi código:
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":...}]}
Quiero que el código imprima to_id como 1543 más imprima 'nulo'
No estoy seguro de cómo hacer esto.
in
verifica explícitamente yraise
si faltan? Simplemente acceda a él sin verificar, y obtendrá exactamente el mismo comportamiento (excepto con un enKeyError
lugar de unValueError
).Si todo lo que quiere es verificar si la clave existe o no
Si desea verificar si hay un valor para la clave
Devuelve un valor predeterminado si falta el valor real
fuente
Es una buena práctica crear métodos de utilidad auxiliar para cosas como esas, de modo que siempre que necesite cambiar la lógica de validación de atributos esté en un solo lugar, y el código sea más legible para los seguidores.
Por ejemplo, cree un método auxiliar (o una clase
JsonUtils
con métodos estáticos) enjson_utils.py
:y luego úsalo en tu proyecto:
NOTA IMPORTANTE:
Hay una razón por la que estoy usando en
data.get(attribute) or default_value
lugar de simplementedata.get(attribute, default_value)
:En mis aplicaciones, obtener el atributo con el valor 'nulo' es lo mismo que no obtener el atributo en absoluto. Si su uso es diferente, debe cambiar esto.
fuente
Intentalo:
O, si solo desea omitir los valores que faltan identificadores en lugar de imprimir
'null'
:Entonces:
Por supuesto, en la vida real, probablemente no desee
print
cada identificación, sino almacenarlas y hacer algo con ellas, pero ese es otro problema.fuente
fuente
Escribí una pequeña función para este propósito. Siéntase libre de reutilizar,
fuente