Ich habe eine Reihe von JSON-Daten aus Facebook-Posts wie den folgenden:
{"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"}
Die JSON-Daten sind halbstrukturiert und nicht alle gleich. Unten ist mein Code:
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":...}]}
Ich möchte, dass der Code die to_id als 1543 druckt, sonst 'null'
Ich bin mir nicht sicher, wie ich das machen soll.
in
Überprüfungen durchgeführt undraise
ob sie fehlen? Greifen Sie einfach ohne Überprüfung darauf zu, und Sie erhalten genau das gleiche Verhalten (außer mit aKeyError
anstelle von aValueError
).Wenn Sie nur prüfen möchten, ob ein Schlüssel vorhanden ist oder nicht
Wenn Sie überprüfen möchten, ob ein Wert für den Schlüssel vorhanden ist
Gibt einen Standardwert zurück, wenn der tatsächliche Wert fehlt
quelle
Es wird empfohlen, Hilfsprogrammmethoden für solche Dinge zu erstellen, damit sich die Logik der Attributvalidierung immer dann an einer Stelle befindet, wenn sie geändert werden muss, und der Code für die Follower besser lesbar ist.
Erstellen Sie beispielsweise eine Hilfsmethode (oder eine Klasse
JsonUtils
mit statischen Methoden) injson_utils.py
:und verwenden Sie es dann in Ihrem Projekt:
WICHTIGE NOTIZ:
Es gibt einen Grund, den ich
data.get(attribute) or default_value
anstelle von einfach verwendedata.get(attribute, default_value)
:In meinen Anwendungen ist das Abrufen eines Attributs mit dem Wert 'null' dasselbe wie das Abrufen des Attributs überhaupt nicht. Wenn Ihre Verwendung anders ist, müssen Sie dies ändern.
quelle
Versuch es:
Oder wenn Sie nur Werte überspringen möchten, bei denen IDs fehlen, anstatt zu drucken
'null'
:So:
Natürlich möchten Sie im wirklichen Leben wahrscheinlich nicht
print
jede ID, sondern sie speichern und etwas mit ihnen tun, aber das ist ein anderes Problem.quelle
quelle
Zu diesem Zweck habe ich eine winzige Funktion geschrieben. Fühlen Sie sich frei, wiederzuverwenden,
quelle