【问题标题】:Which characters are valid/invalid in a JSON key name?JSON 键名中哪些字符有效/无效?
【发布时间】: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 指代)是一种编码,除此之外它还定义了一个字符集。

标签: javascript json object key


【解决方案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 控制字符。
    猜你喜欢
    • 2010-12-12
    • 2010-10-01
    相关资源
    最近更新 更多