python - 如何从 Python 中复杂的嵌套 JSON 响应中获取节点
问题描述
您好我有一个嵌套的 JSON 响应,需要获取特定的节点(显然,一个嵌套结构)。在下面给出的示例中,假设它是“body”,如果它不包含任何内部节点,则返回相同的元素,即。'body' ,如果 'body' 中有 'Message' 节点,那么它应该返回 'Message' 节点。如何在 Python 中处理这种情况。
{
"messageId": "56ba2b85-fb61-4a28-97d3-941237228582",
"receiptHandle": "AQEB9mKPGdkuDgQkH3tNZ5pMd",
"body": {
"Type": "Notification",
"MessageId": "467a4ce6-4a1e-5cab-8801-1be6b30a621f",
"TopicArn": "arn:aws:sns:us-east-2:ttttt:TEST",
"Subject": "01 Publish for TEST ",
"Message": "{\\\"Store\\\":\\\"I01\\\",\\\"Loc\\\":\\\"I03\\\",\\\"User\\\":\\\"P37\\\",\\\"Mile\\\":\\\"1500\\\",\\\"Status\\\":true}\"",
"Timestamp": "2020-04-03T08:41:56.047Z",
"SignatureVersion": "1",
"Signature": "Kg",
"SigningCertURL": "something.com",
"UnsubscribeURL": "subscribermoke.com"
},
"attributes": {
"ApproximateReceiveCount": "42",
"SentTimestamp": "1585903316106",
"SenderId": "AIDAJQR6QDGQ7PATMSYEY",
"ApproximateFirstReceiveTimestamp": "1585903316106"
},
"messageAttributes": {},
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-:jjjjjj:sample-Dev",
"awsRegion": "us-east"
}
附加信息: 这是 JSON 正文中的一个小改动,请查找以供参考。
"消息" : "{\"Store\":\"I01\",\"Loc\":\"I03\",\"User\":\"P37\",\"Mile\":\" 1500\",\"Status\":true}"
我希望将“消息”中的内容作为字典
解决方案
你需要某种形式的递归......但首先你需要修复你的数据对象(我认为)。
这是您需要的大纲:
from pprint import pprint
import json
MESSAGE = {
"messageId": "56ba2b85-fb61-4a28-97d3-941237228582",
"receiptHandle": "AQEB9mKPGdkuDgQkH3tNZ5pMd",
"body": {
"Type": "Notification",
"MessageId": "467a4ce6-4a1e-5cab-8801-1be6b30a621f",
"TopicArn": "arn:aws:sns:us-east-2:ttttt:TEST",
"Subject": "01 Publish for TEST ",
"Message": "{\\\"Store\\\":\\\"I01\\\",\\\"Loc\\\":\\\"I03\\\",\\\"User\\\":\\\"P37\\\",\\\"Mile\\\":\\\"1500\\\",\\\"Status\\\":true}\"",
"Timestamp": "2020-04-03T08:41:56.047Z",
"SignatureVersion": "1",
"Signature": "Kg",
"SigningCertURL": "something.com",
"UnsubscribeURL": "subscribermoke.com"
},
"attributes": {
"ApproximateReceiveCount": "42",
"SentTimestamp": "1585903316106",
"SenderId": "AIDAJQR6QDGQ7PATMSYEY",
"ApproximateFirstReceiveTimestamp": "1585903316106"
},
"messageAttributes": {},
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-:jjjjjj:sample-Dev",
"awsRegion": "us-east"
}
def find_messages_in_body(body):
if "Message" in body:
submsg = body["Message"]
print(submsg)
print(type(submsg))
submsg = json.loads(submsg)
submsg = find_messages_in_body(submsg)
return(submsg)
else:
return body
pprint(find_messages_in_body(MESSAGE["body"]))
但是当你运行它时,你会发现它是炸弹,因为它的值submsg
是一个字符串,而不是一个有效的 JSON 字符串。
那么......你想要的输出又是什么?您确定您正确复制粘贴了输入数据吗?您还有其他输入数据示例吗?
另外......是否有可能会有多个可能的“子消息”?如果是这样,您需要让它返回一个列表,或将其转换为生成器(使用yield
而不是return
语句)。但首先...检查您的数据对象:MESSAGE["body"]["Message"]
此时不是有效的 JSON。
推荐阅读
- mysql - 为什么这个查询不起作用而这个查询起作用?
- material-ui - MenuItem 中的 TextField - onKeyDown 事件干扰 TextField 中的 onChange
- flutter - Flutter/Dart http get 请求响应不完整
- azure - 我们在数据流 Azure 中是否有合并功能
- excel - 如何格式化单元格以在每个单元格的末尾添加 %
- ruby-on-rails - 将哈希深度转换为平面路径数组
- angular - 如何在 UI AutoComplete 中使用表单控件 #1169
- javascript - 用长字符串索引 javascript 对象
- testing - 如何在 Cypress.io 中检查一个元素是否包含多个项目
- performance - 当 Non-Prod DB 大小相对非常小或与 Prod DB 大小不同时,如何在 Non-Prod 中进行性能测试?