繁体   English   中英

如何检查python中是否存在JSON键/对象

[英]How to check JSON key/object exist in python

我是python的新手。 无论如何,除了我的以下代码外,是否要检查python中是否存在特定的JSON对象? 承认我的以下代码不是好习惯,因此需要知道哪种方法可以更好地检查和易于维护?

这是JSON响应:

[
  {
    "MessageId": "250e37a8-d779-48a1-9941-84219a82513e",
    "ReceiptHandle": "AQEBjualXe2ywqTgIVmCNI5sKj7r48werf84HHA2BWZimwiEXLFxA/MiPBclK048NZBtOnM3dSDfoiwwqoNTPxTRz+IChd8McziweCxHX6texjAOi/MyAQjCWP+2hJPoxzQgXx9kjnKbepKlcgxhpOiQZe6WiSIq0dXwHHXSA7SP0g9NIR/dU38b+wmo0m2q7MNVfSct967EKF49wow9RHyFMO8iD8fH93PYT9om5NdUha3dvkWnisKcfuO5pZY3LLXPAnuZT/VfqxJjmPqb98iepBfqFb6SpM/02IVSql81XKJEbMBc4zPHp/Uace6e4UDGsn/hPCVsqQsTzrbKCR+ovpkhXipWwTYSlgsLe/o43k0UxhCN8eKhg835KuUkskA3T8C5Q6v6xgznlR7JJuhZpg==",
    "MD5OfBody": "bbdc5fdb8be7251f5c910905db994bab",
    "Body": "Information about current NY Times fiction bestseller for week of 12/11/2016.",
    "Attributes": {
      "SentTimestamp": "1553851566164"
    },
    "MD5OfMessageAttributes": "d25a6aea97eb8f585bfa92d314504a92",
    "MessageAttributes": {
      "Author": {
        "StringValue": "John Grisham",
        "DataType": "String"
      },
      "Title": {
        "StringValue": "The Whistler",
        "DataType": "String"
      },
      "WeeksOn": {
        "StringValue": "6",
        "DataType": "Number"
      }
    }
  }
]

这是我要检查的python代码:

if 'Messages' in response:
    message = response['Messages'][0]
    receipt_handle = message['ReceiptHandle']

    sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=receipt_handle
    )
    print('Received and deleted message: %s' % message)
else:
    print('Message not received yet')

请让我知道上面的代码是否是好的做法。

由于响应是字典list

j_data = [{'MessageId': '250e37a8-d779-48a1-9941-84219a82513e',
           'ReceiptHandle': 'AQEBjualXJJuhZpg==', 'MD5OfBody': 'bbdc5f905db994bab',
           'Body': 'Information about current NY Times fiction bestseller for week of 12/11/2016.',
           'Attributes': {'SentTimestamp': '1553851566164'},
           'MD5OfMessageAttributes': 'd25a6aea97eb8f585bfa92d314504a92',
           'MessageAttributes': {'Author': {'StringValue': 'John Grisham', 'DataType': 'String'},
                                 'Title': {'StringValue': 'The Whistler', 'DataType': 'String'},
                                 'WeeksOn': {'StringValue': '6', 'DataType': 'Number'}}}
            ]



for data in j_data:
    try:
        if 'MessageId' in data:
            message = data['MessageId']
            receipt_handle = data['ReceiptHandle']
            sentTimeStamp = data['Attributes']['SentTimestamp']
            print(message)
            print(receipt_handle)
            print(sentTimeStamp)
    except KeyError:
        print("Some custom message here")

输出

250e37a8-d779-48a1-9941-84219a82513e
AQEBjualXJJuhZpg==
1553851566164

编辑

另一种方法是在访问之前检查每个密钥,即(从响应中删除了ReceiptHandle元素):

j_data = [{'MessageId': '250e37a8-d779-48a1-9941-84219a82513e',
           'MD5OfBody': 'bbdc5f905db994bab',
           'Body': 'Information about current NY Times fiction bestseller for week of 12/11/2016.',
           'Attributes': {'SentTimestamp': '1553851566164'},
           'MD5OfMessageAttributes': 'd25a6aea97eb8f585bfa92d314504a92',
           'MessageAttributes': {'Author': {'StringValue': 'John Grisham', 'DataType': 'String'},
                                 'Title': {'StringValue': 'The Whistler', 'DataType': 'String'},
                                 'WeeksOn': {'StringValue': '6', 'DataType': 'Number'}}}
            ]



for data in j_data:
    try:
        if 'MessageId' in data:
            message = data['MessageId']
            print(message)
        if 'ReceiptHandle' in data:
            receipt_handle = data['ReceiptHandle']
            print(receipt_handle)
        if 'Attributes' in data:
            sentTimeStamp = data['Attributes']['SentTimestamp']
            print(sentTimeStamp)
    except KeyError:
        print("Some custom message here")

输出

250e37a8-d779-48a1-9941-84219a82513e
1553851566164

首先,如前所述,示例json不包含键Messages 我认为您的代码看起来不错。 但是,如果您有一个没有键Messages的json的情况非常少见,我会尝试尝试一次,除了block。

try:
    message = response['Messages'][0]
    receipt_handle = message['ReceiptHandle']

    sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=receipt_handle
    )
    print('Received and deleted message: %s' % message)
except KeyError:
    print('Message not received yet')

每当您获得“正确的” json时,这将更快。 但是,当您得到缺少键的json时,速度会变慢。 因此,也许您需要找出天气,而关键的缺失经常发生。

但这取决于用例。 我的回答只是我自己对类似用例的看法和经验

您可以检出的另一种选择,也是我在使用JSON数据时实际上更喜欢的一种选择,是从JSON数据中创建一个对象并使用hasattr方法。 这将防止您开始过度使用try-except块,并且还可以使您的代码更易于理解。 以下是使用您的数据的示例:

data= '''
  {
"MessageId": "250e37a8-d779-48a1-9941-84219a82513e",
"ReceiptHandle": "AQEBjualXe2ywqTgIVmCNI5sKj7r48werf84HHA2BWZimwiEXLFxA/MiPBclK048NZBtOnM3dSDfoiwwqoNTPxTRz+IChd8McziweCxHX6texjAOi/MyAQjCWP+2hJPoxzQgXx9kjnKbepKlcgxhpOiQZe6WiSIq0dXwHHXSA7SP0g9NIR/dU38b+wmo0m2q7MNVfSct967EKF49wow9RHyFMO8iD8fH93PYT9om5NdUha3dvkWnisKcfuO5pZY3LLXPAnuZT/VfqxJjmPqb98iepBfqFb6SpM/02IVSql81XKJEbMBc4zPHp/Uace6e4UDGsn/hPCVsqQsTzrbKCR+ovpkhXipWwTYSlgsLe/o43k0UxhCN8eKhg835KuUkskA3T8C5Q6v6xgznlR7JJuhZpg==",
"MD5OfBody": "bbdc5fdb8be7251f5c910905db994bab",
"Body": "Information about current NY Times fiction bestseller for week of 12/11/2016.",
"Attributes": {"SentTimestamp": "1553851566164"},
"MD5OfMessageAttributes": "d25a6aea97eb8f585bfa92d314504a92",
"MessageAttributes": {"Author": {"StringValue": "John Grisham","DataType": "String"},"Title": {"StringValue": "The Whistler","DataType": "String"},"WeeksOn": {"StringValue": "6","DataType": "Number"}}
  } '''

import json

class Response:

    def __init__(self, data):
        self.__dict__ = json.loads(data)

response = Response(data)

if hasattr(response , 'MessageId'):
    receipt_handle = response.ReceiptHandle
    print("Received and deleted message: %s" % response.MessageId)

else:
    print('Message not received yet')

输出:

Received and deleted message: 250e37a8-d779-48a1-9941-84219a82513e

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM