将嵌套JSON转换为Python字典

2024-05-16 11:02:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我收到一个字符串服务器端,然后将其转换为JSON:

127.0.0.1:8000/devices/f751/?json={ "DeviceId":"192-2993-2993", "Date":"1/4/2019 9:52:2", "Location":"-1.000000000,-1.000000000", "Key":"{XXXX-XXXX-XXXX}", "Data":" { \"Value0\":\"{ \"ReferenceValue\":\"Elevation\", \"Prediction\":\"22.216558464\"}\", \"Value1\":\"{ \"ReferenceValue\":\"Wind Speed\", \"Prediction\":\"42.216558464\"}\" } "}

使用json.loads()进行转换后,我得到以下输出:

updatedRequest = json.loads(jsonRequest)
updatedRequest 
{'DeviceId': '192-2993-2993',
'Date': '1/4/2019 9:52:2',
'Location': '-1.000000000,-1.000000000',
'Key': '{XXXX-XXXX-XXXX}',
'Data': '{ "Value0":"{ "ReferenceValue":"Elevation", "Prediction":"22.216558464"}", "Value1":"{ "ReferenceValue":"Wind Speed", "Prediction":"42.216558464"}" }'}

到目前为止,我可以通过updatedRequest['Data']访问数据值。在

^{pr2}$

我在尝试将其转换为Python可用字典时遇到的问题(例如updatedRequest['Data']['Value0']['ReferenceValue'])。因为“值”键的数目未知,所以我不确定将这些键移到可用数据中的最佳方法是什么。在


Tags: keyjsondatadatelocationspeedwindprediction
2条回答

这实际上取决于你想如何处理这些数据。您可以使用以下内容在“数据”字典中循环:

for k,v in updatedRequest['Data'].items():
     # do some stuff

这将允许您处理,而不必处理此字典中的可变项数。很难说什么是最好的,但不知道你到底想做什么!在

您已经收到一个JSON文档,其中包含一个嵌套的JSON文档,它本身包含更多的JSON文档,内部像Matryoshka doll。在

不幸的是,您只能解码一个级别,因为下一个级别是中断的。在用于第三级JSON文档的"引号字符前面应该有\转义,就像第二级引号嵌入到顶级JSON文档中时转义一样。这些都丢失了,因此没有JSON解析器可以对其进行解码。JSON字符串周围的分隔符已被作为JSON字符串值一部分的散乱、未转义的"字符破坏。在

您需要修复发送此数据的客户端,并将这些格式错误的值作为无效请求丢弃。在

为完整起见,有效的文档如下所示:

>>> v0 = '''{ "ReferenceValue":"Elevation", "Prediction":"22.216558464"}'''
>>> v1 = '''{ "ReferenceValue":"Wind Speed", "Prediction":"42.216558464"}" }'''
>>> data_value = json.dumps({'Value0': v0, 'Value1': v1})
>>> print(json.dumps({'Data': data_value, 'Date': '1/4/2019 9:52:2', 'DeviceId': '192-2993-2993', 'Key': '{XXXX-XXXX-XXXX}', 'Location': '-1.000000000,-1.000000000'}, indent=4))
{
    "Data": "{\"Value0\": \"{ \\\"ReferenceValue\\\":\\\"Elevation\\\", \\\"Prediction\\\":\\\"22.216558464\\\"}\", \"Value1\": \"{ \\\"ReferenceValue\\\":\\\"Wind Speed\\\", \\\"Prediction\\\":\\\"42.216558464\\\"}\\\" }\"}",
    "Date": "1/4/2019 9:52:2",
    "DeviceId": "192-2993-2993",
    "Key": "{XXXX-XXXX-XXXX}",
    "Location": "-1.000000000,-1.000000000"
}

注意\"和{}在Data值中转义。解码时,Data的字符串值将删除一级转义序列,形成"和{}序列,其中"引号是JSON语法的一部分,\"是字符串值的一部分,这些字符串值又可以被解码为在最里面的JSON文档中使用的"。在

相关问题 更多 >