将嵌套的JSON转换为Python字典

时间:2019-01-10 21:25:04

标签: python json dictionary

我正在接收字符串服务器端,然后将其转换为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']访问“数据”值。

updatedRequest['Data']

'{ "Value0":"{ "ReferenceValue":"Elevation", "Prediction":"22.216558464"}", "Value1":"{ "ReferenceValue":"Wind Speed", "Prediction":"42.216558464"}" }'

尝试将其转换为Python可用字典(例如updatedRequest['Data']['Value0']['ReferenceValue'])时遇到的问题。由于“ Value”键的数量未知,因此我不确定将其转换为可用数据的最佳过程。

2 个答案:

答案 0 :(得分:1)

您已经收到一个带有嵌套JSON文档的JSON文档,该文档本身包含其他JSON文档,就像Matryoshka doll一样。

不幸的是,您只能解码一个级别,因为下一个级别已损坏。在用于\的引号字符之前,应将"用作第3层JSON文档的引号,就像将第2层引号嵌入顶级JSON文档时将其转义一样。这些丢失了,因此没有JSON解析器可以对其进行解码。 JSON字符串周围的分隔符已被杂散的,未转义的"字符破坏了,这些字符原本应该是JEON字符串值的一部分。

您要么需要修复发送此数据的 client ,然后将这些格式错误的值作为无效请求丢弃。

出于完整性考虑,有效文档如下所示:

>>> 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文档中使用的"

答案 1 :(得分:-1)

这实际上取决于您要对数据做什么。您可以使用以下命令遍历“数据”字典:

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

这将使您无需处理此词典中可变数量的项目即可进行处理。很难说什么是最好的,却不知道您到底想做什么!