【问题标题】:How to parse JSON string with unescaped properties in Node.js ES6如何在 Node.js ES6 中解析具有未转义属性的 JSON 字符串
【发布时间】:2018-09-24 05:22:18
【问题描述】:

我有以下字符串,其中包含带有非转义属性的 JSON,我想在 Node.js/ES6 中解析它:

const A="{prop1=null, prop2=SOME-VALUE, prop3=[{prop4=2018-04-13T19:07:47.008Z}]}"

如何正确解析,或者有没有比 JSON.parse 更安全的 JSON 解析器,因为:

JSON.parse("{prop1=null, prop2=SOME-VALUE, prop3=[{prop4=2018-04-13T19:07:47.008Z}]}")

正在抛出错误:

VM2683:1 Uncaught SyntaxError: Unexpected token p in JSON at position 1
at JSON.parse (<anonymous>)

更新:

这是从外部系统获取的无效 JSON,我想无论如何都想用一些可能与这样的内容一起工作的解析器来解析它,或者 (lib) 逃避它的方式在

之后使用 JSON.parse 的有效 JSON

【问题讨论】:

  • 这不是 JSON。你从哪里得到的?
  • 这不是 JSON,如果无法在 JSON 中得到,您可能需要手动解析出 = 和 之间的内容
  • const A 实际上是一个字符串...
  • 实际格式是什么?外部系统是什么?它希望您如何处理这些数据?
  • 我不会将其作为答案发布,因为它很hacky并且可能会失败,但这是尝试的开始:jsfiddle.net/gmvns4ms

标签: javascript json node.js parsing ecmascript-6


【解决方案1】:

有许多库能够以松散的方式解析无效 JSON,例如loose-json。问题是这个字符串是不是 JSON。由于字符串不是合法的JS,所以也无法求值。

字符串不能用常规replace 处理,因为它遵循某些语法,例如= 分隔符可以替换为 : 作为向 JSON 迈出的一步,但包含 = 字符的值不应受到影响。应首先对字符串进行标记并根据预期的语法进行处理。

某些库可能有助于标记化,例如 esprima (esprima.tokenize()),但必须根据特定的文件格式对不一致进行大量工作:

  • null属性值,解析器应该如何判断是null还是'null'字符串?

  • 属性值没有用引号括起来,应该如何处理空格?

【讨论】:

    【解决方案2】:

    根据您的更新,您将需要编写一个自定义字符串解析器,将源转换为一些有效的 JSON 字符串,然后使用 JSON.parse() - 或者您甚至可以忽略 JSON.parse 方法并直接创建对象,如果你想要(那会很痛苦)。

    您可以使用正则表达式或任何字符串操作方法将replace 例如= 转换为: 等...

    【讨论】:

      【解决方案3】:

      这不是 JSON,没有 JSON 解析器能够处理它:

      • JSON 使用冒号而不是等号将键与值分开
      • 作为字符串的 JSON 键和值必须用引号“”括起来

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 2014-02-23
        • 2013-02-20
        相关资源
        最近更新 更多