কী উপস্থিত আছে কিনা তা পরীক্ষা করে দেখুন এবং পাইথন ব্যবহার করে জেএসএন অ্যারে পুনরুক্ত করুন


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

জেএসএন ডেটা আধা-কাঠামোগত এবং সমস্ত এক নয়। নীচে আমার কোডটি দেওয়া হয়েছে:

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 হিসাবে অন্য 'নাল'

আমি কীভাবে এটি করব তা নিশ্চিত নই।

উত্তর:


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

'নাল' ফিরে আসবে এবং 'ডিফল্ট মান' খ হিসাবে প্রত্যাশিত a 'এ': 1, 'বি': নাল}
মাইকেল

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'

আমার অ্যাপ্লিকেশনগুলিতে মান 'নাল' দিয়ে অ্যাট্রিবিউট পাওয়াটা মোটেও অ্যাট্রিবিউট না পাওয়ার সমান। যদি আপনার ব্যবহার আলাদা হয় তবে আপনার এটি পরিবর্তন করা দরকার।


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.