我正在接收字符串服务器端,然后将其转换为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”键的数量未知,因此我不确定将其转换为可用数据的最佳过程。
答案 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
这将使您无需处理此词典中可变数量的项目即可进行处理。很难说什么是最好的,却不知道您到底想做什么!