Eu tenho um monte de dados JSON de postagens no Facebook como o abaixo:
{"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"}
Os dados JSON são semiestruturados e nem todos são iguais. Abaixo está o meu 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":...}]}
Eu quero que o código imprima o to_id como 1543 else print 'null'
Não sei ao certo como fazer isso.
in
verificações explícitas eraise
se elas estão ausentes? Basta acessá-lo sem verificar e você obterá exatamente o mesmo comportamento (exceto com um emKeyError
vez de aValueError
).Se tudo o que você deseja é verificar se a chave existe ou não
Se você deseja verificar se existe um valor para a chave
Retorne um valor padrão se o valor real estiver ausente
fonte
É uma boa prática criar métodos de utilidade auxiliar para coisas assim, para que, sempre que você precise alterar a lógica da validação de atributo, ela esteja em um único local e o código seja mais legível para os seguidores.
Por exemplo, crie um método auxiliar (ou classe
JsonUtils
com métodos estáticos) emjson_utils.py
:e depois use-o no seu projeto:
NOTA IMPORTANTE:
Há uma razão que estou usando, em
data.get(attribute) or default_value
vez de simplesmentedata.get(attribute, default_value)
:Nos meus aplicativos, obter atributo com o valor 'null' é o mesmo que não obter o atributo. Se o seu uso for diferente, você precisará alterar isso.
fonte
Tente:
Ou, se você quiser apenas pular os valores dos IDs ausentes, em vez de imprimir
'null'
:Assim:
Obviamente, na vida real, você provavelmente não deseja
print
cada identificação, mas armazená-las e fazer algo com elas, mas isso é outra questão.fonte
fonte
Eu escrevi uma pequena função para esse fim. Sinta-se livre para redirecionar,
fonte