Как вы представляете бесконечность в JSON API?

каков наилучший способ представления бесконечности в JSON API? например, бесплатно читать статьи за этот месяц (это будет конечное число на некоторых подписках и бесконечное на премиум-подписке).

Это лучшая идея, чтобы вернуться null для этого случая использования или расширения JSON и используйте javascript Infinity значение? Последнее кажется более подходящим, но я никогда не видел примера API, который делает это.

было бы круто, если бы у любого были примеры общедоступных веб-API, которые представляют бесконечность.

6 ответов


Я бы включил поле "limit", которое существует только тогда, когда действительно есть предел:

когда у пользователя осталось 40:

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

когда пользователь имеет неограниченный доступ, удалите его, то есть нет предела:

{
    "yourdata":""
}

мое предложение-использовать числа для определенных значений и строки для теоретических значений. Я думаю, это самое ясное.

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

тем не менее, это не кажется популярным выбором. Я видел -1,null и undefined (отсутствие имущества) означает неограниченное во многих случаях.

в VMware мы используем -1, чтобы указать, что нет ограничений (память, процессор, VMs), и у нас были проблемы с использованием null, потому что BlazeDS преобразовал null в 0, и 0 был допустимым значение.


вероятно, будет лучше представлять неограниченные подписки как совершенно другой тип подписки, поэтому у вас даже нет проблемы с тем, как представлять бесконечность. В будущем вы можете поэкспериментировать с подписками, основанными на времени, а не на количестве, например, неограниченный доступ в течение месяца, и тогда вам придется иметь дело с датой expriry.

тем не менее, не будет ли конечное, но достаточно большое число, такое как 1e100? Если у вас математика, 1e100 - 1 = 1e100 в ограниченной точности чисел с плавающей запятой.


вы не можете расширить JSON. Ну, вы можете продлить его, но тогда это больше не JSON. Невозможно представить бесконечность или NaN в JSON. Существует очень строгий синтаксис для чисел, и бесконечность или NaN не являются его частью.

вы можете сохранить очень большое значение (1e300), вы можете использовать строку " Inf " или " NaN " и убедиться, что все обрабатывают ее правильно, или, возможно, использовать {"value":" Inf"}, а затем вы можете быть уверены, что все либо правильно ее обрабатывают, либо крахи.


Итак,вы хотите, чтобы ваша ИТ-система представляла абстрактную концепцию для вашего реального случая использования? Не делай этого. Она вообще не соотносится с реальностью.

в реальности не существует бесконечного количества свободно читаемых статей, так зачем его моделировать?

даже если клиент платит премию, вы не сможете доставить бесконечные статьи! ;)

просто используйте большое число. Тогда у вас будет меньше сложности. Меньше путать следующего разработчика, меньше специальные случаи для обработки.

да, число, которое вы выберете, будет довольно произвольным, но что с того?


Я бы рекомендовал использовать значение Бесконечности JavaScripts, потому что оно согласовано.

например:

var x = 1;
var y = 0;

var z = x / y;

console.log(z);

// results in `Infinity`

Я бы сказал null - также другой выбор, но это может быть ошибочно принято за никакой ценности где Infinity на самом деле значение бесконечной возможности.

определенно не используйте NaN. Это странный зверь, и Эс извинился за эту аномалию.

возьмите это, например:

var x = NaN;

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

в выше ответ приводит к " что?- что говорит нам о том, что Нэн-это некая ценность, а не число.

кроме того,typeof это number. Вы можете сказать, положительная это бесконечность или отрицательная. Если вы работаете с числами, используйте Infinity. Он последовательно равен Infinity и будет лучшим решением.

var x = Math.log(0);

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

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

обновление

С здесь - вы можете использовать:

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