我是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')
请让我知道上面的代码是否是好的做法。
答案 0 :(得分:2)
首先,正如您已经提到的,示例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时速度会变慢。因此,也许您需要找出天气,关键的缺失是否经常发生。
但这取决于用例。我的回答只是我对类似用例的看法和经验
答案 1 :(得分:1)
由于响应是字典的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
答案 2 :(得分:1)
您可以签出的另一种选择,也是我在使用JSON数据时实际上更喜欢的一个选择,就是从JSON数据中创建一个对象并使用spring.datasource.url=jdbc:h2:file:~/test2;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
spring.datasource.username=admin
spring.datasource.password=password
spring.h2.console.enabled=true
方法。这将防止您开始过度使用try-except块,并且还可以使您的代码更易于理解。以下是使用您的数据的示例:
hasattr
输出:
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')