Mam kilka danych JSON z postów na Facebooku, takich jak ten poniżej:
{"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"}
Dane JSON są częściowo ustrukturyzowane i nie są takie same. Poniżej mój kod:
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":...}]}
Chcę, aby kod wypisał to_id jako 1543, w przeciwnym razie wypisz 'null'
Nie wiem, jak to zrobić.
in
kontrole iraise
jeśli ich brakuje? Po prostu uzyskaj do niego dostęp bez sprawdzania, a otrzymasz dokładnie to samo zachowanie (z wyjątkiem aKeyError
zamiast aValueError
).Jeśli chcesz tylko sprawdzić, czy klucz istnieje, czy nie
Jeśli chcesz sprawdzić, czy istnieje wartość klucza
Zwróć wartość domyślną, jeśli brakuje rzeczywistej wartości
źródło
Dobrą praktyką jest tworzenie pomocniczych metod narzędziowych do takich rzeczy, aby za każdym razem, gdy trzeba zmienić logikę walidacji atrybutów, znajdowałoby się to w jednym miejscu, a kod byłby bardziej czytelny dla obserwujących.
Na przykład utwórz metodę pomocniczą (lub klasę
JsonUtils
z metodami statycznymi) wjson_utils.py
:a następnie użyj go w swoim projekcie:
WAŻNA UWAGA:
Jest powód, dla którego używam
data.get(attribute) or default_value
zamiast po prostudata.get(attribute, default_value)
:W moich aplikacjach uzyskanie atrybutu o wartości „null” jest tym samym, co jego całkowity brak. Jeśli Twoje użycie jest inne, musisz to zmienić.
źródło
Spróbuj:
Lub, jeśli chcesz po prostu pominąć wartości brakujących identyfikatorów zamiast drukowania
'null'
:Więc:
Oczywiście w prawdziwym życiu prawdopodobnie nie chcesz
print
każdego identyfikatora, ale przechowywać je i coś z nimi robić, ale to inna sprawa.źródło
źródło
W tym celu napisałem małą funkcję. Zapraszam do zmiany przeznaczenia,
źródło