【问题标题】:Using Javascript, how can I parse a JSON string containing a JSON string?使用 Javascript,如何解析包含 JSON 字符串的 JSON 字符串?
【发布时间】: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


【解决方案1】:

我昨天通过过滤掉不需要的元素使解析工作。首先用 '{' 替换所有 '"{' 实例,然后用 '}' 替换所有 '}"' 实例,最后删除所有反斜杠。

let data = jsonData.replace(/"{/g, '{').replace(/}"/g, '}').replace(/\\/g, '');
let parsed = JSON.parse(data);

我同意这可能应该在后端处理。但现在让页面启动并运行就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多