【发布时间】:2019-10-01 15:13:33
【问题描述】:
我正在使用 Javascript 从 Azure 表存储中读取数据,其中一列包含 JSON 字符串。所以我得到了一个我不知道如何格式化的字符串,以便我可以解析它。
让 jsonData = '{"时间戳":"2019-10-01T14:19:48.2593745+00:00","数据":"{\"app_id\":\"apple\",\"dev_id\":\"node1\ ",\"hardware_serial\":\"001122334455667788\",\"port\":1,\"counter\":63,\"payload_raw\":\"afIWk0ccABwM1Ag=\",\"payload_fields\":{ \"doorState\":\"open\",\"湿度\":31,\"位置\":{\"lat\":0,\"lon\":0},\"温度\": 22.6},\"元数据\":{\"时间\":\"2019-10-01T14:19:48.009374928Z\",\"频率\":867.9,\"调制\":\"LORA\" ,\"data_rate\":\"SF7BW125\",\"coding_rate\":\"4/5\",\"gateways\":[{\"gtw_id\":\"banana\",\"gtw_trusted \":true,\"timestamp\":3579682692,\"time\":\"2019-10-01T14:19:47Z\",\"channel\":7,\"rssi\":-118, \"snr\":-5,\"rf_chain\":0,\"latitude\":0,\"longitude\":0,\"altitude\":172,\"location_source\":\"registry \"},{\"gtw_id\":\"banana\",\"timestamp\":567219172,\"time\":\"2019-10-01T14:19:47.98531Z\",\"channel\ ":7,\"rssi\":-55,\"snr\":10,\"rf_chain\":0,\"latitude\":0,\"longitude\":0,\"location_source\" :\"registry\"}]},\"downlink_url\":\"https://www.someurl.com\"}"}';
经过一些测试,我发现除了内部 JSON 对象周围的引号之外,转义反斜杠也会导致问题。
简而言之,解析失败:
let jsonData2 = '{"Test":"21342345","Data":"{\"test\":\"ethneipnrt\"}"}';
但这有效:
let jsonData2 = '{"Test":"21342345","Data":{"test":"ethneipnrt"}}';
但是如何自动格式化字符串以便解析工作?
【问题讨论】:
-
如果可能,您应该修复生成此数据的逻辑。如果没有,那么您只需再次致电
JSON.parse。例如。JSON.parse(JSON.parse(jsonData2).Data). -
@FelixKling 我认为问题在于原始
JSON.parse返回无效的 JSON 字符串(它包括反斜杠)。 -
@TylerRoper 是的,我认为你是对的。它已经在第一个 JSON.parse 上失败了,所以据我所知,第二个 JSON.parse 永远不会运行。
-
真的取决于上下文。
{"Test":"21342345","Data":"{\"test\":\"ethneipnrt\"}"}是有效的 JSON。现在如果你把它放到一个 JavaScript string literal 你会得到无效的 JSON,因为\"变成了"。话虽如此,确实没有理由编写(或生成)包含包含 JSON 的字符串文字的 JavaScript 代码。你是如何得到 JSON 的? -
如果您通过 XHR 获取字符串,那么它应该可以按预期工作。它是有效的 JSON,您可以在此处验证:jsonlint.com。如果您像在示例中那样将其放入字符串文字中,它将不起作用。但正如我所说,理想情况下,生成数据的系统一开始不会对它进行双重编码。
标签: javascript json