Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中从复杂的嵌套JSON响应中获取节点_Python_Json_Aws Lambda_Amazon Sqs_Amazon Sns - Fatal编程技术网

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

如何在Python中从复杂的嵌套JSON响应中获取节点,python,json,aws-lambda,amazon-sqs,amazon-sns,Python,Json,Aws Lambda,Amazon Sqs,Amazon Sns,嗨,我有一个嵌套的JSON响应,需要获取特定的节点(显然是一个嵌套结构)。在下面给出的示例中,假设它是“body”,如果它不包含任何内部节点,则返回相同的元素,即“body”,如果“body”中有“Message”节点,则它应返回“Message”节点。如何在Python中处理此场景 { "messageId": "56ba2b85-fb61-4a28-97d3-941237228582", "receiptHandle": "AQEB9mKPGdkuDgQkH3tNZ5pMd",

嗨,我有一个嵌套的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}”

我希望“消息”中的内容为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。

首先:向我们展示您的工作和迄今为止的尝试。第三:我有一种预感,您的“body”元素是“双重编码的”:看起来像是有人对消息进行了JSON编码,并将结果字符串设置为“body”的值元素,然后再次对其进行JSON编码。这是--依我看--非常草率的设计。这可以容纳在解码器中。。。你只需要有根据地猜测什么时候需要额外解码JSON。我只有这个JSON响应,这就是故事的开始。有时“body”不包含节点,而是包含我在“Message”节点中给出的JSON字符串。有时,主体包含子节点,就像我在结构中共享的一样。我想获取JSON字符串并将其传递给HTTP端点。此结构不是我设计的。我必须将内容放在“body”中,使其成为一个有时不包含子节点的“body”,而是包含json字符串(在“message”键中提供)