【问题标题】:JSON and Binary NumbersJSON 和二进制数
【发布时间】:2018-02-06 17:53:44
【问题描述】:

现在新的 javascript 接受二进制数(即 0b1111)不应该也接受 JSON 吗?还是它们是两个独立的实体?

console.log(Number.isNaN(0b1111); // = 'false' meaning it is a number

但是

JSON.parse('{"a":0b1111}');

不起作用。

【问题讨论】:

  • JSON 是 Javascript 语法的子集。并非 JS 允许的所有内容都在 JSON 中。

标签: javascript json binary-data


【解决方案1】:

JSON 被有意设计为 Javascript 语法的有限子集。这允许它用于表示常见的数组和对象格式,同时最小化解析器的复杂性。因此,虽然 Javascript 文字语法允许以多种替代方式来表示同一事物,但 JSON 通常只允许一种。

例如在 Javascript 中,您可以在字符串周围使用单引号或双引号,但 JSON 只允许使用双引号。在 Javascript 中,键对象周围的引号是可选的(如果键是有效标识符),但在 JSON 中是必需的。

更改 JSON 以允许更多格式会出现问题,因为它会导致与旧解析器的兼容性问题。所以 JSON 设计者不太可能将它扩展为不需要的东西。我认为最近所做的唯一改变是正式允许不是对象或数组的顶级值。大多数解析器已经接受了这一点。因此,除非所有流行库的作者都添加二进制整数,否则他们不太可能将其作为 JSON 规范的一部分。

【讨论】:

  • 谢谢。即使在 json.org 页面上,它也声明:“JSON 是一种完全独立于语言的文本格式”。再一次,错误的命名('Javascript' Object Notation)。
  • @kevdev 虽然它依赖于语言,但它显然是通过从 Javascript 文字语法开始并对其进行精简而设计的。在 PHP 脚本中使用 echo json_encode() 来输出要直接替换到 Javascript 源代码中的文字,我并不感到羞耻。
【解决方案2】:

JSON 不是 Javascript :)

查看https://json.org/(右列)中 number 的语法生成,您会发现 JSON 中没有二进制文字数字这样的东西。

【讨论】:

    【解决方案3】:

    来自MDN

    二进制数

    二进制数语法使用前导零,后跟小写或大写拉丁字母“B”(0b 或 0B)。

    你所拥有的是一个 binary 类型的数字字面量。分配的值是一个数字。该数字稍后在对象中用作十进制类型(标准)。

    var object = { v: 0b1111 };
    
    console.log(JSON.stringify(object));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      相关资源
      最近更新 更多