Можете ли вы использовать запятую в JSON-объекте?

json syntax delimiter

90618 просмотра

17 ответа

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

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

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

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

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

Автор: Ben Combee Источник Размещён: 21.08.2019 11:38

Ответы (17)


223 плюса

Решение

К сожалению, спецификация 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 из словаря некоторой формы, - это всегда добавлять запятую после каждой записи (как вы делаете выше), а затем добавлять фиктивную запись в конце, которая не имеет запятой (но не запаздывает). это просто лень; ->).

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

Автор: brianb Размещён: 14.10.2008 04:19

126 плюса

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

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

Автор: Ben Combee Размещён: 14.10.2008 04:02

101 плюса

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

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

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

Автор: Overflowee Размещён: 16.12.2011 07:38

19 плюса

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

Автор: Tobu Размещён: 15.07.2012 08:18

13 плюса

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

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

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
Автор: Rik Heywood Размещён: 16.10.2008 07:26

13 плюса

Как уже было сказано, спецификация 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):

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("]");
Автор: vaxquis Размещён: 12.04.2014 05:06

7 плюса

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

Автор: James Curran Размещён: 14.10.2008 05:29

4 плюса

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

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

http://json5.org/

https://github.com/aseemk/json5

Автор: user619271 Размещён: 24.08.2014 07:35

2 плюса

Согласно спецификации класса 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

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

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

Автор: Timoty Weis Размещён: 22.04.2015 09:14

1 плюс

Исходя из прошлого опыта, я обнаружил, что разные браузеры по-разному обрабатывают конечные запятые в JSON.

И Firefox, и Chrome отлично с этим справляются. Но IE (Все версии), кажется, сломался. Я имею в виду действительно сломать и перестать читать остальную часть сценария.

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

:)

Автор: dnshio Размещён: 14.10.2011 03:59

1 плюс

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

Может не работать, если у вас нет общего количества до выполнения генерации JSON.

Опять же, если вы используете PHP 5.2.0 или выше, вы можете просто отформатировать свой ответ, используя встроенный JSON API.

Автор: eddie Размещён: 11.11.2010 09:26

1 плюс

С 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

Автор: Steven Spungin Размещён: 08.02.2018 02:05

0 плюса

Я обычно зацикливаюсь на массиве и добавляю запятую после каждой записи в строке. После цикла я снова удаляю последнюю запятую.

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

Автор: Nils Размещён: 11.12.2008 10:06

0 плюса

Это не рекомендуется, но вы все равно можете сделать что-то подобное, чтобы разобрать его.

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)

Автор: feibing Размещён: 01.11.2017 09:35

0 плюса

Существует возможный способ избежать ветвления if в цикле.

s.append("[ "); // there is a space after the left bracket
for (i = 0; i < 5; ++i) {
  s.appendF("\"%d\",", i); // always add comma
}
s.back() = ']'; // modify last comma (or the space) to right bracket
Автор: Zhang Boyang Размещён: 18.11.2018 03:00

0 плюса

Поскольку цикл for используется для итерации по массиву или подобной итерируемой структуре данных, мы можем использовать длину массива, как показано ниже:

awk -v header="FirstName,LastName,DOB" '
  BEGIN {
    FS = ",";
    print("[");
    columns = split(header, column_names, ",");
  }
  { print("  {");
    for (i = 1; i < columns; i++) {
      printf("    \"%s\":\"%s\",\n", column_names[i], $(i));
    }
    printf("    \"%s\":\"%s\"\n", column_names[i], $(i));
    print("  }");
  }
  END { print("]"); } ' datafile.txt

С datafile.txt, содержащим,

 Angela,Baker,2010-05-23
 Betty,Crockett,1990-12-07
 David,Done,2003-10-31
Автор: Gregory Horne 07AD Размещён: 01.03.2019 03:34

0 плюса

NO. Вы не можете поставить запятую в конце, к сожалению ... глупая мелочь, если бы все было наоборот ... но это НЕ.

Автор: Jerome Stonebridge Размещён: 21.08.2019 08:36
Вопросы из категории :
32x32