如何在 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"
}
但是,这似乎不是流行的选择。我见过 -1
、null
和 undefined
(没有 属性)在很多情况下都意味着无限。
在 VMware,我们使用 -1 来指定没有限制(内存、CPU、虚拟机)并且我们在使用 null 时遇到了问题,因为 BlazeDS 将 null 转换为 0,而 0 是有效的值。
数字 1e500 被解析为无穷大
console.log(1e500); // Gives Infinity
Or
JSON.parse('{"number": 1e500}'); // Gives {number: Infinity}
在 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"
}
但是,这似乎不是流行的选择。我见过 -1
、null
和 undefined
(没有 属性)在很多情况下都意味着无限。
在 VMware,我们使用 -1 来指定没有限制(内存、CPU、虚拟机)并且我们在使用 null 时遇到了问题,因为 BlazeDS 将 null 转换为 0,而 0 是有效的值。
数字 1e500 被解析为无穷大
console.log(1e500); // Gives Infinity
Or
JSON.parse('{"number": 1e500}'); // Gives {number: Infinity}