it-swarm.com.de

Überprüfen Sie, ob der Schlüssel vorhanden ist, und wiederholen Sie das JSON-Array mit Python

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 sind 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 das to_id ausgibt, da sonst 1543 'null' ausgegeben wird.

Ich bin mir nicht sicher, wie ich das machen soll.

Vielen Dank!

102
pravi
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)

Ausgabe:

In [9]: getTargetIds(s)
to_id: 1543
127
inspectorG4dget

Wenn Sie nur prüfen möchten, ob ein Schlüssel vorhanden ist oder nicht

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

Wenn Sie überprüfen möchten, ob ein Wert für den Schlüssel vorhanden ist

h.get('b') # returns None

Gibt einen Standardwert zurück, wenn der tatsächliche Wert fehlt

h.get('b', 'Default value')
75
athap

Es ist eine gute Praxis, Hilfsprogrammmethoden für solche Dinge zu erstellen, damit der Code für die Follower besser lesbar ist, wenn Sie die Logik der Attributvalidierung an einer Stelle ändern müssen.

Erstellen Sie beispielsweise eine Hilfsmethode (oder Klasse JsonUtils mit statischen Methoden) in json_utils.py:

def get_attribute(data, attribute, default_value):
    return data.get(attribute) or default_value

und benutze es dann in deinem Projekt:

from json_utils import get_attribute

def my_cool_iteration_func(data):

    data_to = get_attribute(data, 'to', None)
    if not data_to:
        return

    data_to_data = get_attribute(data_to, 'data', [])
    for item in data_to_data:
        print('The id is: %s' % get_attribute(item, 'id', 'null'))

WICHTIGER HINWEIS:

Es gibt einen Grund, warum ich data.get(attribute) or default_value anstelle von data.get(attribute, default_value) benutze:

{'my_key': None}.get('my_key', 'nothing') # returns None
{'my_key': None}.get('my_key') or 'nothing' # returns 'nothing'

In meinen Anwendungen entspricht das Abrufen eines Attributs mit dem Wert 'null' dem Abrufen des Attributs überhaupt nicht. Wenn Ihre Verwendung anders ist, müssen Sie dies ändern.

13
MikeL
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'))

Versuch es:

>>> getTargetIds(jsonData)
to_id: 1543
to_id: null

Oder, wenn Sie nur fehlende IDs überspringen möchten, anstatt 'null':

def getTargetIds(jsonData):
    data = json.loads(jsonData)
    for dest in data['to']['data']:
        if 'id' in to_id:
            print("to_id:", dest['id'])

Damit:

>>> getTargetIds(jsonData)
to_id: 1543

Natürlich möchten Sie im wirklichen Leben wahrscheinlich nicht jede ID print speichern, sondern sie speichern und etwas damit anfangen, aber das ist ein anderes Problem.

5
abarnert
if "my_data" in my_json_data:
         print json.dumps(my_json_data["my_data"])
1
Ajit Surendran