【问题标题】:How do I convert the following to a valid JSON?如何将以下内容转换为有效的 JSON?
【发布时间】:2019-06-17 19:09:55
【问题描述】:

给定

var test = '{key1: "val1", data:{ key2: "val2", key3: "val3" }}' => returned by third party library 

expectedOutput = {key1: "val1", data:{ key2: "val2", key3: "val3" }}

我试过 JSON.parse(test) => 抛出错误 我试过 JSON.parse(JSON.stringify(test)) => 返回字符串双重解析结果错误。

我错过了什么?

如何通过解析获得 JSON 而不是字符串?

【问题讨论】:

  • 如果第三方库返回那个......那是你的麻烦。该字符串不是有效的 JSON。要么:它声称它正在返回 JSON(错误,但因为它不是),或者你假设它“应该是”JSON,因为它看起来像它(但它不是)。
  • 这是什么第三方库,返回无效的 JSON?
  • console.log(JSON.parse(JSON.stringify(test))) 这对你不起作用吗?

标签: javascript json jsonparser


【解决方案1】:

您可能需要引用您的密钥:

var test = '{"key1": "val1", "data":{ "key2": "val2", "key3": "val3" }}'

并非所有 JSON 解析器都希望键被引用

【讨论】:

  • JSON 明确需要双引号键。如果 JSON 解析器允许,则它不符合 JSON 规范。
  • @DanH 是的,尽管情况并非总是如此。标准化是相当新的(考虑到 JSON 的时代) JSON 在标准化之前大约有 13 年的历史,在此之前它只是“JavaScript O bject Notation" 允许不带引号的键
  • @RunsFS:如果 OP 依赖于一个超过 13 年且从那时起没有更新过的库,那么他可能有更大的问题,即过时的 JSON 合规性!也就是说:我怀疑库不打算输出 JSON,而 OP 只是假设它是。
  • @DanH 是的,取决于一个 13 岁的图书馆会很奇怪,但我不知道你为什么这么认为。我说 JSON 在标准之前已经存在了 13 年。这意味着有相当多的代码实际上可能依赖于不兼容的库(或更准确地说是向后兼容的库),并不是说这里就是这种情况,我在之前的评论中也不是
【解决方案2】:

您缺少键周围的“s”

错误: JSON.parse('{key1: "val1", data:{ key2: "val2", key3: "val3" }}')

对: JSON.parse('{"key1": "val1", "data":{ "key2": "val2", "key3": "val3" }}')

【讨论】:

    【解决方案3】:

    为键添加双引号,因为解析器需要它们 -

    var test = '{"key1": "val1", "data":{ "key2": "val2", "key3": "val3" }}'
    console.log(JSON.parse(test))

    【讨论】:

      【解决方案4】:

      你的问题:我怎样才能得到有效的 JSON 开始?

      我说...使用JSON.stringify()

      也就是说,如果你只是在学习 JSON(看起来你是),那么使用 JSON.stringify() 作为教学工具。

      在您的控制台中,输入:

      obj = {key1: "val1", data:{ key2: "val2", key3: "val3" }}
      JSON.stringify(obj)
      

      你会看到结果是有效的 JSON:

      '{"key1":"val1","data":{"key2":"val2","key3":"val3"}}'
      

      从这里,您可以看到您缺少键周围的双引号。

      【讨论】:

      • 我知道 JSON 字符串化。正如我上面提到的,我首先进行了字符串化然后解析。但输出仍然是双编码字符串
      • @user2821242 :您的代码与我的不同。您的代码将无效 JSON 的 JavaScript 字符串发送到 stringify。我的代码向stringify 发送了一个JavaScript 对象。如果你不知道其中的区别......你还在学习。
      • 是的,我知道它是无效的 JSON,并且无效的 JSON 字符串是从我无法控制的第三方传递的。因此问题!但感谢您的帮助
      【解决方案5】:

      如果您遇到该库返回字符串中的 JavaScript 值的问题,您可以使用 JavaScript 的 eval(),如下所示:

      # nominal return value -- valid JavaScript in a string (that isn't JSON) 
      var rval_str = '{key1: "val1", data:{ key2: "val2", key3: "val3" }}'
      # use eval() to 'decode' rval_str
      eval("rval = " + rval_str)
      rval
      

      给予

      {key1: "val1", data:{ key2: "val2", key3: "val3" }}
      

      当然,如果您不相信图书馆返回的内容,这是非常冒险的(使用eval)。

      【讨论】:

        猜你喜欢
        • 2019-11-20
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        相关资源
        最近更新 更多