如何在Python中从复杂的嵌套JSON响应中获取节点



Hi我有一个嵌套的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正文中的一个小更改,请找到它供您参考。

"Message":"{\"Store\":\"I01\",\"Loc\":"I03\","User\":\"P37\",\"Mile\":\"1500\",\"Status\":true}">
我希望"Message"中的内容作为dict

您需要某种形式的递归。。。但首先你需要修复你的数据对象(我认为(。

这是你需要的东西的概要:

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。

最新更新