JSON 键名中哪些字符有效/无效?

Posted

技术标签:

【中文标题】JSON 键名中哪些字符有效/无效?【英文标题】:Which characters are valid/invalid in a JSON key name? 【发布时间】:2012-01-30 08:27:44 【问题描述】:

对于 javascript 对象或 JSON 字符串,键名中是否有任何禁止字符?还是需要转义的字符?

更具体地说,我想在键名中使用“$”、“-”和空格。

【问题讨论】:

我认为这个答案部分与您的编码方式有关。例如,UTF8 与 ANSI 允许的字符不同。 您可以使用obj['whatever'] 表示法在JS 中使用您想要的任何“键”。但obj.whatever 版本只能使用常规字母数字键。 @invalidsyntax:根据定义,JSON 是 Unicode。另外,ANSI 不是一种编码,它是一个字符集,所以比较应该是 Unicode-vs-ANSI,而不是 UTF-8-vs-ANSI。 旧讨论,但是,ASCII(人们通常用 ANSI 指代)是一种编码,除此之外它还定义了一个字符集。 【参考方案1】:

以下字符必须在 JSON 数据中转义以避免任何问题:

"(双引号) \(反斜杠) 所有控制字符,如\n\t

JSON Parser可以帮你处理JSON。

【讨论】:

嗨阿伦,单引号不需要转义。事实上,转义它们会导致严格的 JSON 解析器抛出异常。请参阅json.org 的字符串部分当然,但是当您在 JSON 字符串中时需要转义它们(但不是 JSON 本身)。 @AlexKey 你完全正确! Arun,您可以在 jsonlint.com 上通过测试 JSON "singlequotetest": "something here isn\'t right" "singlequotetest": "Fixing here what wasn't right" 来检查这一点 @Arun Rana - 不用担心。 "*~@#$%^&*()_+=>/": "是一个有效的 json" "??": "not nice, but still valid json"【参考方案2】:

值得一提的是,虽然以数字开头的键是有效的,但它可能会导致一些意想不到的问题。

例子:

var testObject = 
    "1tile": "test value"
;
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround

【讨论】:

我真的希望,在这个 2017/18 微软时代,他们对自己造成的所有痛苦感到遗憾。 查看他们的指标 ID 参数:dev.applicationinsights.io/apiexplorer/… ---他们的 15 或 20 个字段在其 json 字段名称中有多个正斜杠。虽然 Karns 解决方案适用于特定领域,但我似乎无法让它适用于 1tile 的子领域。例如,后续的点为我返回 undefined。 这应该是最好的答案【参考方案3】:

必须避免使用 U+D800 到 U+DFFF 的 Unicode 代码点:它们在 Unicode 中是 invalid,因为它们是为 UTF-16 代理对保留的。一些 JSON 编码器/解码器将用 U+FFFD 替换它们。参见例如how the Go language and its JSON library deals with them。

因此避免单独使用“\uD800”到“\uDFFF”(而不是代理对)。

【讨论】:

【参考方案4】:

没有。任何有效的字符串都是有效的键。它甚至可以有",只要你逃脱它:

"The \"meaning\" of life":42

您可能会在将此类值加载到某些语言中遇到困难,这些语言试图将键与对象字段名称相关联。但是,我不知道有任何此类情况。

【讨论】:

谢谢!还有其他需要转义的字符吗?喜欢:或; ? 不是那些。在 JavaScript 中需要转义的任何东西通常都需要在 JSON 中。不过,最好在 json.org 上从马嘴里得到它。端到端阅读整个规范大约需要一分钟。 恕我直言,这不是一个好的答案。哪些字符需要转义?哪些字符可以转义,但不必转义? 谁能澄清这是否包括Unicode空字符(U + 0000,UTF-8中的纯“空字节”)等? json.org 和链接的官方/正式 ECMA 规范 PDF 似乎都暗示是的,它们在 JSON 中是有效的,即使在它们的文字形式中也是如此(不仅仅是在 \u four-hex-digits 形式中)。 @mtraceur 我也在想同样的事情。我在 chrome 的控制台中进行了测试,它不喜欢带有空终止符的键。 puu.sh/zJMIS/3d15c6d8e5.png 规范中可能没有提到,但不要指望解析器接受它。我认为最好避免使用任何 ascii 控制字符。

以上是关于JSON 键名中哪些字符有效/无效?的主要内容,如果未能解决你的问题,请参考以下文章

我如何通过在这里进行字符串拆分来获取 json 键名? (Python)

如何解析具有动态键名的嵌套 json

php中数组可以使用哪些键名

Restkit — 如何用可变键名映射 json 对象

如何在laravel刀片中从json解码中回显键名和键值

PHP json转换 无键名数据格式转换为有键名格式