При ручной генерации объекта или массива JSON часто проще оставить запятую в последнем элементе объекта или массива. Например, код для вывода из массива строк может выглядеть следующим образом (в псевдокоде C ++):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
давая вам строку, как
[0,1,2,3,4,5,]
Это разрешено?
alert([1, 2, 3, ].length)
будет отображаться «4».Ответы:
К сожалению, спецификация JSON не допускает конечную запятую. Есть несколько браузеров, которые позволяют это, но, как правило, вам нужно беспокоиться обо всех браузерах.
В общем, я пытаюсь перевернуть проблему и добавить запятую перед фактическим значением, чтобы вы получили код, который выглядит следующим образом:
Эта лишняя строка кода в вашем цикле for вряд ли стоит дорого ...
Другая альтернатива, которую я использовал при выводе структуры в JSON из словаря некоторой формы, - это всегда добавлять запятую после каждой записи (как вы делаете выше), а затем добавлять фиктивную запись в конце, которая не имеет запятой (но не запаздывает). это просто лень; ->).
К массиву не работает, к сожалению.
источник
if
s просто чтобы избежать этой глупой маленькой запятой. Что касается дороговизны YMMV, см. Это, например, jsfiddle.net/oriadam/mywL9384. Разъяснение: Ваше решение великолепно, я просто ненавижу спецификации, которые запрещают запятую в конце.Нет. Спецификация JSON, поддерживаемая на сайте http://json.org , не допускает конечных запятых. Из того, что я видел, некоторые парсеры могут молча разрешать их при чтении строки JSON, в то время как другие выдают ошибки. Для совместимости вы не должны включать его.
Приведенный выше код можно реструктурировать, либо удалить запятую при добавлении терминатора массива, либо добавить запятую перед элементами, пропустив ее для первого.
источник
Просто, дешево, легко читается и всегда работает независимо от спецификаций.
Избыточное присвоение $ delim - очень маленькая цена. Также работает так же хорошо, если нет явного цикла, но есть отдельные фрагменты кода.
источник
if
легче понять. Но спасибо, что поделились.for(let ..., sep=""; ... ; sep=",") { ...
Конечные запятые разрешены в JavaScript, но не работают в IE. Бездокументарная спецификация Дугласа Крокфорда JSON не позволяла им, и, поскольку она не имела версий, это не должно было измениться. Спецификация ES5 JSON позволила использовать их в качестве расширения, но у Крокфорда RFC 4627 этого не произошло, и ES5 снова отказался от них. Firefox последовал его примеру. Internet Explorer - вот почему у нас не может быть хороших вещей.
источник
Как уже было сказано, спецификация JSON (на основе ECMAScript 3) не допускает запятой в конце. ES> = 5 позволяет, так что вы можете использовать эту запись в чистом JS. Об этом спорили, и некоторые парсеры его поддерживали ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas- больше не принимается / ), но это особый факт (как показано на http://json.org/ ), что он не должен работать в JSON. Эта вещь сказала ...
... Мне интересно, почему никто не указал, что вы можете на самом деле разделить цикл на 0-й итерации и использовать начальную запятую вместо конечной, чтобы избавиться от запаха кода сравнения и любых фактических издержек производительности в цикле, что приведет к код, который на самом деле короче, проще и быстрее (из-за отсутствия ветвления / условных обозначений в цикле), чем другие предлагаемые решения.
Например (в псевдокоде в стиле C, аналогичном предлагаемому коду OP):
источник
PHP-кодеры могут захотеть проверить implode () . Это берет массив соединяет его, используя строку.
Из документов ...
источник
Интересно, что и C & C ++ (и я думаю, что C #, но я не уверен) специально разрешают запятую в конце - именно по этой причине: это значительно упрощает программную генерацию списков. Не уверен, почему JavaScript не последовал их примеру.
источник
Используйте JSON5. Не используйте JSON.
http://json5.org/
https://github.com/aseemk/json5
источник
Существует возможный способ избежать ветвления if в цикле.
источник
Согласно спецификации класса JSONArray :
Итак, насколько я понимаю, нужно разрешить написать:
Но может случиться так, что некоторые парсеры вернут 7 как количество элементов (как IE8, как указал Дэниел Эрвикер) вместо ожидаемых 6.
Отредактировано:
Я нашел этот JSON Validator, который проверяет строку JSON по RFC 4627 (тип носителя application / json для нотации объектов JavaScript) и по спецификации языка JavaScript. На самом деле здесь массив с конечной запятой считается действительным только для JavaScript, а не для спецификации RFC 4627.
Однако в спецификации RFC 4627 указано, что:
Для меня это опять проблема интерпретации. Если вы напишите, что элементы разделяются запятыми (без каких-либо особых случаев, например, последнего элемента), это можно понять обоими способами.
PS RFC 4627 не является стандартом (как явно указано) и уже устарел в RFC 7159 (который является предлагаемым стандартом) RFC 7159
источник
value-separator
безvalue
права рядом с ним. Также текст очень специфичен. «Разделение значений» может применяться только при наличии нескольких значений. Так что если у вас есть два значения рядом друг с другом, они разделяются запятой. Если у вас есть одно значение (или если вы смотрите только на значение в конце), разделение отсутствует, следовательно, нет запятой.Исходя из прошлого опыта, я обнаружил, что разные браузеры по-разному обрабатывают конечные запятые в JSON.
И Firefox, и Chrome отлично с этим справляются. Но IE (все версии), кажется, сломался. Я имею в виду действительно сломать и перестать читать остальную часть сценария.
Учитывая это, а также тот факт, что всегда приятно писать совместимый код, я предлагаю потратить дополнительные усилия, чтобы убедиться, что нет запятой.
:)
источник
Я веду текущий счет и сравниваю его с общим счетом. Если текущий счет меньше общего, я отображаю запятую.
Может не работать, если у вас нет общего количества до выполнения генерации JSON.
Опять же, если вы используете PHP 5.2.0 или выше, вы можете просто отформатировать свой ответ, используя встроенный JSON API.
источник
С 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
источник
json object
использованиемJSON.parse
или с использованием библиотекиRJSON.parse
. Я бы согласился с вами, если бы источником был объект, но здесь это не так. Я не вижу, где в вопросеdownstream
вообще упоминается, что он потребляет объект или строку.Я обычно зацикливаюсь на массиве и добавляю запятую после каждой записи в строке. После цикла я снова удаляю последнюю запятую.
Возможно, не лучшим способом, но менее дорогим, чем проверка каждый раз, если это последний объект в цикле, я думаю.
источник
Это не рекомендуется, но вы все равно можете сделать что-то подобное, чтобы разобрать это.
источник
Поскольку цикл for используется для итерации по массиву или подобной итерируемой структуре данных, мы можем использовать длину массива, как показано ниже:
С datafile.txt, содержащим,
источник
Как указано, это не разрешено. Но в JavaScript это так:
(отлично работает в Firefox, Chrome, Edge, IE11 и без в IE9, 8, 7, 5)
источник