जाँचें कि क्या कुंजी मौजूद है और पायथन का उपयोग करके JSON सरणी को पुनरावृत्त करें


130

मेरे पास नीचे दिए गए जैसे फेसबुक पोस्ट से JSON डेटा का एक गुच्छा है:

{"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"}

JSON डेटा अर्ध-संरचित है और सभी समान नहीं है। नीचे मेरा कोड है:

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":...}]}

मैं चाहता हूं कि कोड to_id को 1543 के रूप में प्रिंट करें और 'null' प्रिंट करें

मुझे यकीन नहीं है कि यह कैसे करना है।

जवाबों:


162
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)

आउटपुट:

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

6
यह स्पष्ट inजांच क्यों करते हैं और raiseयदि वे गायब हैं? बिना जाँच के बस इसे एक्सेस करें, और आपको बिलकुल वैसा ही व्यवहार मिलेगा (एक के KeyErrorबजाय छोड़कर ValueError)।
२२:४४ को जन्नत

100

यदि आप चाहते हैं कि सभी जाँच करें कि क्या कुंजी मौजूद है या नहीं

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

यदि आप जांचना चाहते हैं कि क्या कुंजी के लिए कोई मूल्य है

h.get('b') # returns None

यदि वास्तविक मान गायब है, तो डिफ़ॉल्ट मान लौटाएं

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

{expected a ’: 1,
ull

16

इस तरह की चीजों के लिए सहायक उपयोगिता विधियां बनाना एक अच्छा अभ्यास है ताकि जब भी आपको विशेषता सत्यापन के तर्क को बदलने की आवश्यकता हो, तो यह एक ही स्थान पर होगा, और कोड अनुयायियों के लिए अधिक पठनीय होगा।

उदाहरण के लिए एक सहायक विधि (या JsonUtilsस्थिर विधियों के साथ वर्ग ) बनाएँ json_utils.py:

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

और फिर इसे अपने प्रोजेक्ट में उपयोग करें:

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

महत्वपूर्ण लेख:

एक कारण है कि मैं data.get(attribute) or default_valueबस के बजाय उपयोग कर रहा हूँ data.get(attribute, default_value):

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

मेरे अनुप्रयोगों में 'null' मान के साथ विशेषता प्राप्त करना समान है, क्योंकि यह विशेषता बिल्कुल नहीं मिल रही है। यदि आपका उपयोग अलग है, तो आपको इसे बदलने की आवश्यकता है।


4
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'))

कोशिश करो:

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

या, यदि आप मुद्रण के बजाय अनुपलब्ध आईडी को छोड़ना चाहते हैं 'null':

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

इसलिए:

>>> getTargetIds(jsonData)
to_id: 1543

निश्चित रूप से वास्तविक जीवन में, आप शायद printप्रत्येक आईडी को नहीं चाहते हैं , लेकिन उन्हें स्टोर करने और उनके साथ कुछ करने के लिए, लेकिन यह एक और मुद्दा है।



4

मैंने इस उद्देश्य के लिए एक छोटा कार्य लिखा। पुन: पेश करने के लिए स्वतंत्र महसूस करें,

def is_json_key_present(json, key):
    try:
        buf = json[key]
    except KeyError:
        return False

    return True
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.