Как сгенерировать объект JSON динамически с помощью дубликатов ключей?

Я знаю, что это будет звучать невозможно, но мой босс сказал мне, что я ДОЛЖЕН отправить JSON через пост-вызов AJAX с jQuery, который ДОЛЖЕН ИМЕТЬ КЛЮЧИ DUPLICATE. проблема в том, что если я напишу что-то вроде этого:

$.post("someurl", {
     "key1" : "value1",
     "key2" : "value2",
     "key2" : "value3",
     "key2" : "value4",
     "key3" : "value5"
});

jQuery отправит запрос как

someurl?key1=value1&key2=value4&key3=value5

все это, потому что Javascript перезаписывает свойства с тем же именем. Объект JSON генерируется динамически, и я НЕ ДОПУСКАЮТ использовать в нем массивы. Может ли кто-нибудь сказать мне, как я могу сгенерировать объект JSON dinamicaly и с дублирующими ключами?

Я бы очень ценю любую помощь от вас!

Ответ 1

Из того, что я вижу, {"a": "b", "a": "c"} действительно действует JSON в соответствии с RFC 4627.

Структура объекта представлена ​​в виде пары фигурных скобок    окружающие ноль или несколько пар имен/значений (или членов). Имя - это    строка. Каждое двоеточие появляется после каждого имени, отделяя имя    от значения. Одна запятая отделяет значение от следующего    имя. Имена внутри объекта СЛЕДУЕТ быть уникальными.

... где SHOULD означает:

3. ДОЛЖЕН. Это слово или прилагательное "РЕКОМЕНДУЕТСЯ" означает, что там    могут существовать обоснованные причины в определенных обстоятельствах, чтобы игнорировать    конкретный пункт, но следует понимать все последствия и    тщательно взвешивается перед выбором другого курса.

Так что да, в принципе вы можете это сделать, это законно, но это тоже плохая идея. Различные JSON-декодеры, вероятно, будут обрабатывать эту ситуацию по-разному и/или неочевидными способами. Посмотрите, что требует спецификация парсеров:

Парсер JSON преобразует текст JSON в другое представление.    Парсер JSON ДОЛЖЕН принять все тексты, соответствующие грамматике JSON.    Анализатор JSON MAY принимает не-JSON-формы или расширения.

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

... но реализация не должна обрабатывать подобные ситуации. Например:

# Python 2.7
>>> import json
>>> json.JSONDecoder().decode('{"a": "b", "a": "c"}')
`{u'a': u'c'}`
# Chrome 32
> JSON.parse('{"a": "b", "a": "c"}')
Object {a: "c"}

... и другие реализации могут юридически дать вам (в нотации Python):

  • {"a": "b"}
  • [("a", "b"), ("a", "c")]
  • [("a", ["b", "c"])]
  • []
  • 42
  • "your JSON is bad and you should feel bad"

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

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

Ответ 2

Объект Javascript с дублирующимися ключами не является объектом Javascript. На самом деле это не более чем плод вашего воображения. Это абсолютно невозможно.

Единственный способ сделать это - с массивом:

{
     "key1" : "value1",
     "key2" : ["value2", "value3", "value4"],
     "key3" : "value5"
}

jQuery преобразует это значение в key1=value1&key2%5B%5D=value2&key2%5B%5D=value3&key2%5B%5D=value4&key3=value5

Это действительно единственный способ сделать это. * Есть ли причина, по которой ваш код не может генерировать действительный JSON?

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

Ответ 3

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

Ответ 4

Если вы не можете изменить источник в источнике, то измените источник на то, что вы, по крайней мере, можете работать с...

Разберите JSON в массив пар значений ключа (не в объект пар ключ/значение).

Вы можете сделать это легко, если у вас есть доступ к строке JSON, просто замените все "," на "}, {" и заверните результат в "[" и "]".

Теперь у вас есть действительный массив JSON пар ключ/значение, который является javascript.