Можете ли вы использовать запятую в JSON-объекте? - PullRequest
353 голосов
/ 14 октября 2008

При ручной генерации объекта или массива JSON часто проще оставить запятую в последнем элементе объекта или массива. Например, код для вывода из массива строк может выглядеть (в псевдокоде на C ++):

s.append("[");
for (i = 0; i < 5; ++i) {
    s.appendF("\"%d\",", i);
}
s.append("]");

дает вам строку, как

[0,1,2,3,4,5,]

Это разрешено?

Ответы [ 16 ]

214 голосов
/ 14 октября 2008

К сожалению спецификация JSON не допускает конечную запятую. Есть несколько браузеров, которые позволяют это, но обычно вам нужно беспокоиться обо всех браузерах.

В общем, я пытаюсь перевернуть проблему и добавить запятую перед фактическим значением, чтобы вы получили код, который выглядит следующим образом:

s.append("[");
for (i = 0; i < 5; ++i) {
  if (i) s.append(","); // add the comma only if this isn't the first entry
  s.appendF("\"%d\"", i);
}
s.append("]");

Эта лишняя строка кода в вашем цикле for вряд ли стоит дорого ...

Другая альтернатива, которую я использовал при выводе структуры в JSON из словаря некоторой формы, - всегда добавлять запятую после каждой записи (как вы делаете выше), а затем добавлять фиктивную запись в конце, который не заканчивается запятая (но это просто лень; ->).

К сожалению, не работает с массивом.

124 голосов
/ 14 октября 2008

Нет. Спецификация JSON, поддерживаемая на http://json.org,, не допускает запятые. Из того, что я видел, некоторые парсеры могут молча разрешать их при чтении строки JSON, в то время как другие выдают ошибки. Для совместимости вы не должны включать его.

Приведенный выше код может быть реструктурирован либо для удаления запятой при добавлении терминатора массива, либо для добавления запятой перед элементами, пропуская ее для первого.

98 голосов
/ 16 декабря 2011

Просто, дешево, легко читается и всегда работает независимо от спецификаций.

$delimiter = '';
for ....  {
    print $delimiter.$whatever
    $delimiter = ',';
}

Избыточное присвоение $ delim - очень небольшая цена. Также работает так же хорошо, если нет явного цикла, но есть отдельные фрагменты кода.

19 голосов
/ 16 июля 2012

Конечные запятые разрешены в JavaScript, но не работают в IE. Бездокументарная спецификация Дугласа Крокфорда JSON не позволяла им, и, поскольку она не имела версий, это не должно было измениться. Спецификация ES5 JSON позволила использовать их как расширение, но у Крокфорда RFC 4627 этого не произошло, и ES5 вернулся к их запрету. Firefox последовал их примеру. Internet Explorer - вот почему у нас не может быть хороших вещей.

13 голосов
/ 12 апреля 2014

Как уже было сказано, спецификация JSON (на основе ECMAScript 3) не допускает запятую в конце. ES> = 5 позволяет, так что вы можете использовать эту запись в чистом JS. Об этом спорили, и некоторые парсеры поддерживали его (http://bolinfest.com/essays/json.html, http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/),, но это особый факт (как показано на http://json.org/), что он ) не должен работать в JSON. Это говорит ...

... Мне интересно, почему никто не указал, что на самом деле можно разделить цикл на 0-й итерации и использовать ведущую запятую вместо конечной, чтобы избавиться от запаха кода сравнения и любых других фактические издержки производительности в цикле, в результате чего код на самом деле короче, проще и быстрее (из-за отсутствия ветвления / условных выражений в цикле), чем другие предложенные решения.

например. (в псевдокоде в стиле C, аналогичном предлагаемому коду OP):

s.append("[");
// MAX == 5 here. if it's constant, you can inline it below and get rid of the comparison
if ( MAX > 0 ) {
    s.appendF("\"%d\"", 0); // 0-th iteration
    for( int i = 1; i < MAX; ++i ) {
        s.appendF(",\"%d\"", i); // i-th iteration
    }
}
s.append("]");
12 голосов
/ 16 октября 2008

PHP-кодеры могут захотеть проверить implode () . Это берет массив соединяет его, используя строку.

Из документов ...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
7 голосов
/ 14 октября 2008

Интересно, что и C & C ++ (и я думаю, что C #, но я не уверен) специально разрешают использовать запятую в конце - именно по этой причине: это значительно упрощает программное создание списков. Не уверен, почему JavaScript не последовал их примеру.

4 голосов
/ 24 августа 2014

Используйте JSON5. Не используйте JSON.

  • Объекты и массивы могут иметь запятые
  • Ключи объекта можно не заключать в кавычки, если они являются действительными идентификаторами
  • Строки могут быть в одинарных кавычках
  • Строки могут быть разбиты на несколько строк
  • Числа могут быть шестнадцатеричными (основание 16)
  • Числа могут начинаться или заканчиваться (ведущей или конечной) десятичной точкой.
  • Числа могут включать в себя бесконечность и бесконечность.
  • Числа могут начинаться с явного знака плюс (+).
  • Разрешены как встроенные (однострочные), так и блочные (многострочные) комментарии.

http://json5.org/

https://github.com/aseemk/json5

2 голосов
/ 22 апреля 2015

Согласно спецификации Class JSONArray :

  • Дополнительная (запятая) может появляться перед закрывающей скобкой.
  • Нулевое значение будет вставлено при наличии (запятая) elision.

Итак, насколько я понимаю, следует разрешить написать:

[0,1,2,3,4,5,]

Но может случиться так, что некоторые парсеры вернут число 7 как количество элементов (как IE8, как указал Дэниел Уорвикер) вместо ожидаемого 6.


Отредактировано:

Я нашел этот JSON Validator , который проверяет строку JSON по RFC 4627 (тип носителя application / json для нотации объектов JavaScript) и по спецификации языка JavaScript. На самом деле, здесь массив с конечной запятой считается действительным только для JavaScript, а не для спецификации RFC 4627.

Однако в спецификации RFC 4627 указано, что:

2,3. Массивы

Структура массива представляется в виде квадратных скобок, окружающих ноль или больше значений (или элементов). Элементы разделяются запятыми.

array = begin-array [ value *( value-separator value ) ] end-array

Для меня это опять проблема интерпретации. Если вы напишите, что Элементы разделены запятыми (без указания каких-либо особых случаев, например, последнего элемента), это можно понять обоими способами.

P.S. RFC 4627 не является стандартом (как явно указано) и уже устарел в RFC 7159 (который является предлагаемым стандартом) RFC 7159

1 голос
/ 08 февраля 2018

С Relaxed JSON вы можете иметь запятые, или просто оставить запятые . Они не являются обязательными.

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

Посмотрите на спецификацию Relaxed JSON, и вы увидите, насколько "шумна" оригинальная спецификация JSON. Слишком много запятых и кавычек ...

http://www.relaxedjson.org

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

http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D

...