如何在 JSON API 中表示无穷大?

How do you represent infinity in a JSON API?

在 JSON API 中表示无穷大的最佳方式是什么?例如免费阅读本月的文章(部分订阅数量有限,高级订阅数量无限)。

对于这个用例 return null 还是 扩展 JSON 并使用 javascript的Infinity值?后者似乎更合适,但我从未见过执行此操作的 API 的示例。

如果有人有任何 public Web API 代表无穷大的示例,那也很棒。

可能将无限订阅表示为完全不同的类型订阅会更好,这样您甚至不会遇到如何表示无限的问题。将来您可能想尝试基于时间而不是数字的订阅,例如一个月内无限制访问,然后您将不得不处理到期日。

就是说,像 1e100 这样的有限但足够大的数字不可以吗?如果你做数学运算,1e100 - 1 = 1e100 在浮点运算的有限精度中。

我会包含一个字段 "limit",它仅在确实存在限制时才存在:

当用户还剩 40 个时:

{
    "yourdata":"",
    "limit": 40
}

当用户有无限访问权限时删除它,意思是没有限制:

{
    "yourdata":""
}

我建议使用 JavaScripts Infinity 值,因为它是一致的。

例如:

var x = 1;
var y = 0;

var z = x / y;

console.log(z);

// results in `Infinity`

我会说 null 也是另一种选择,但这可能会被误认为 没有价值 ,因为 Infinity 实际上是一个无限可能的价值。

绝对不要使用NaN。这是一只奇怪的野兽,ES 对此异常表示歉意。

以此为例:

var x = NaN;

if (x === x) {
    console.log('Good');
} else {
    console.log('What?');
}

以上答案的结果是 'What?',它告诉我们 NaN 实际上是某种不是数字的值。

另外,它的typeof是一个number。您可以判断它是正无穷大还是负无穷大。如果您要处理数字,请使用 Infinity。它始终等于 Infinity,将是最佳解决方案。

var x = Math.log(0);

console.log(x);
console.log(typeof(x));

if (x === x) {
    console.log('yes');
}

更新

来自 HERE - 您可以使用:

{ a: { is_infinity: true, value: null }, b: { is_infinity: false, value: 10 } }

您无法延长 JSON。好吧,您可以扩展它,但它不再是 JSON。在 JSON 中无法表示 Infinity 或 NaN。数字有非常严格的语法,Infinity 或 NaN 不在其中。

您可以存储一个非常大的值 (1e300),您可以使用字符串 "Inf" 或 "NaN" 并确保每个处理它的人都能正确处理它,或者可以使用 { "value": "Inf" } 然后你可以非常确定每个人要么正确处理它要么崩溃。

我的建议是用数字表示具体值,用字符串表示理论值。我觉得最清楚了。

{
  "shoes": 89,
  "cars": "infinity",
  "myBankAccount": "negative-infinity"
}

但是,这似乎不是流行的选择。我见过 -1nullundefined(没有 属性)在很多情况下都意味着无限。

在 VMware,我们使用 -1 来指定没有限制(内存、CPU、虚拟机)并且我们在使用 null 时遇到了问题,因为 BlazeDS 将 null 转换为 0,而 0 是有效的值。

数字 1e500 被解析为无穷大


console.log(1e500); // Gives Infinity

Or

JSON.parse('{"number": 1e500}'); // Gives {number: Infinity}