Ответ 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. Если вы хотите это сделать, вам придется сделать это вручную - создайте собственные абстрактные деревья синтаксиса, свои собственные парсеры, свои собственные генераторы, генераторы для всех, кто захочет потреблять ваши данные...