JSON密钥名称中哪些字符有效/无效?


151

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

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


我认为这个答案部分与您的编码方式有关。例如,UTF8与ANSI允许使用不同的字符。
invalidsyntax

4
您可以使用obj['whatever']符号在JS中使用所需的任何“键” 。但是,仅常规字母数字键可用于该obj.whatever版本。
Marc B

4
@invalidsyntax:根据定义,JSON是Unicode。而且,ANSI不是编码,而是字符集,因此比较应该是Unicode-vs-ANSI,而不是UTF-8-vs-ANSI。
Marcelo Cantos

1
古老的讨论不过,ASCII(人们通常用ANSI指代)是一种编码,并且它还定义了一个字符集。
特立尼达

Answers:


167

否。任何有效的字符串都是有效的密钥。"只要您能逃脱它,它甚至可以拥有:

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

在将此类值加载到某些语言(尝试将键与对象字段名称关联)时,您可能会遇到困难。我不知道有任何这样的情况。


谢谢!还有其他需要转义的字符吗?像:或; ?
Christophe

11
不是那些。JavaScript中需要转义的内容通常都需要JSON。最好从json.org上从马口中获得它。端到端读取整个规范大约需要一分钟。
Marcelo Cantos

3
恕我直言,这不是一个好答案。哪种字符需要转义?哪些字符可以转义,但不必转义?
Daniel W.

谁能澄清这是否包括Unicode空字符(U + 0000,UTF-8中的纯“空字节”)之类的东西?两个json.org和链接官方/正式ECMA规范PDF似乎暗示着,是的,这些都是有效的JSON,甚至在他们的文字形式(不只是在\u four-hex-digits形式)。
mtraceur

1
@OutofOrbit可以将其加载到未类型化的对象中吗?
马塞洛·坎托斯

54

后面的字符必须在JSON数据中转义,以避免出现任何问题

'单引号

报价

\反斜杠

所有控制字符,例如\ n \ t

JSON解析器可以帮助您处理JSON。

编辑: 这是替换的JSON解析器,因为OP的链接已死


5
嗨,阿伦,单引号不需要转义。实际上,对它们进行转义将导致严格的JSON解析器引发异常。请参阅json.org的字符串部分。但是,当您放入JSON字符串(而不是JSON本身)时,您当然需要对其进行转义。
Alex KeySmith 2014年

5
@AlexKey你是完全正确的!阿伦,您可以通过测试JSON 与{ "singlequotetest": "something here isn\'t right"}{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be

@Arun Rana-不用担心。
Alex KeySmith 2014年

3
{“ *〜@#$%^&*()_ + => <?/”:“是有效的json”}
Abhi 2014年

45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos,2015年

12

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

例:

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

6
我真的希望,在微软这个2017/18时代,他们为自己遭受的所有痛苦感到遗憾。
monsto

1
查看其指标ID参数:dev.applicationinsights.io/apiexplorer / ... --- 15或20个字段的json字段名称中有多个正斜杠。虽然Karns解决方案适用于特定领域,但我似乎无法使它适用于1tile的子领域。例如,下一个点对我来说返回undefined。
乔恩·卢扎德

为什么在那里提到IE?在每个ECMAScript实现中,以数字开头的标识符都是非法的。
m93a

@ m93a IE并非Internet Explorer的首字母缩写...不好的单词选择:/
karns

这应该是最好的答案
Joe Elia

7

必须避免使用Unicode代码点U + D800到U + DFFF:它们在Unicode 中无效,因为它们是为UTF-16代理对保留的。一些JSON编码器/解码器会将其替换为U + FFFD。例如,查看Go语言及其JSON库如何处理它们

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.