我们想在 JVM 中解析 JSON5 文档,但是 GitHub 上可用的 JSON5 特定库 似乎都没有得到非常低的支持。由于解析器通常会吸引安全漏洞,因此我们不希望使用尚未被社区广泛使用和审查的解析器。
这让我们想知道:Jackson JSON 解析器 的可选功能可以用来解析 JSON5 吗?
通过启用以下可选的 Jackson 解析器功能:
ALLOW_UNQUOTED_FIELD_NAMES
ALLOW_TRAILING_COMMA
ALLOW_SINGLE_QUOTES
ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER
ALLOW_NON_NUMERIC_NUMBERS
ALLOW_JAVA_COMMENTS
ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS
似乎可以支持 JSON5 的所有标题功能,除了:
Jackson 具有 许多可选功能,可以在解析器上启用这些功能,以使其在解析方式上更加宽松。
将这些解析器选项与 JSON5 的标题特性进行比较,我们发现支持以下内容:
对象键可以是 ECMAScript 5.1 IdentifierName。
✅ 支持
ALLOW_UNQUOTED_FIELD_NAMES
功能
对象可能有一个尾随逗号。
数组可能有一个尾随逗号。
✅ 都支持
ALLOW_TRAILING_COMMA
功能
字符串可以用单引号引起来。
✅ 支持
ALLOW_SINGLE_QUOTES
功能
字符串可以通过转义新行字符来跨越多行。
字符串可能包含字符转义。
✅ 这两个 似乎都得到杰克逊的 ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER
功能的支持,尽管这里逃脱的意义或目的可能略有不同。 DYOR.
数字可以是 IEEE 754 正无穷大、负无穷大和 NaN。
✅ 支持
ALLOW_NON_NUMERIC_NUMBERS
功能
允许单行和多行评论。
✅ 支持
ALLOW_JAVA_COMMENTS
功能。
Jackson 部分支持以下 JSON5 功能:
数字可能有前导或尾随小数点。
✅
ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS
功能支持前导小数点。
⛔️ Jackson 似乎不支持尾随小数点。
目前(2021 年中)似乎没有任何方法可以配置 Jackson 以允许以下 JSON5 功能:
数字可以是十六进制的。
数字可能有尾随小数点。
数字可能以明确的加号开头。
额外的空白字符是允许的。
Javascript开发者可以使用微软开发的jsonc-parser。
jsonc-parser
可以在浏览器和 node.js 环境中使用。
这里有一个示例,演示如何使用“jsonc-parser”npm 包来解析 JSON5 字符串:
import * as jsonc from 'jsonc-parser';
const jsonString = `{
// This is a JSON5 string!
"name": 'John Doe',
"age": 42,
"isMarried": false,
"pets": [
{
"name": 'Fluffy',
"type": 'cat'
}
]
}`;
const parsedJson = jsonc.parse(jsonString);
console.log(parsedJson);
在线演示:JSON5解析器