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 键名中哪些字符有效/无效?的主要内容,如果未能解决你的问题,请参考以下文章