Это действительный JSON?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/ говорит да.
http://www.json.org/ ничего не говорит о том, что это запрещено.
Но, очевидно, это не имеет особого смысла, не так ли? В большинстве реализаций, вероятно, используется хеш-таблица, поэтому она все равно переопределяется.
Dictionary<string, string>
Ответы:
Из стандарта (стр. II) :
Далее в стандарте (стр. 2) спецификация для объекта JSON:
В нем не упоминается, что дубликаты ключей являются недействительными или допустимыми, поэтому в соответствии со спецификацией я бы смело предположил, что они разрешены.
То, что большинство реализаций библиотек JSON не принимают дубликаты ключей, не противоречит стандарту из-за первой цитаты.
Вот два примера, относящихся к стандартной библиотеке C ++. При десериализации некоторого объекта JSON в a
std::map
имеет смысл отказаться от дублирующих ключей. Но при десериализации некоторого объекта JSON в astd::multimap
имеет смысл принимать дубликаты ключей как обычно.источник
std::multimap
пример, который я только что добавил. Его можно сериализовать как объект JSON с потенциально дублирующимися ключами.{"a":1,"a":2}
это набор из двух различных пар ключ / значение. В самом деле, даже{"a":1,"a":1}
можно рассматривать как набор пар ключ / значение, в которых есть только один элемент. Тот факт, что это повторяется, можно рассматривать как просто синтаксическую причуду. Лучшим определением было бы: «Объект - это частичная функция от строк (имен) до значений».Краткий ответ: да, но не рекомендуется.
Длинный ответ: это зависит от того, что вы называете действительным ...
ECMA-404 «Синтаксис обмена данными JSON» ничего не говорит о дублированных именах (ключах).
Тем не менее, в RFC 8259 «Формат обмена данными JavaScript (JSON)» говорится:
В этом контексте СЛЕДУЕТ понимать как указано в BCP 14 :
RFC 8259 объясняет, почему уникальные имена (ключи) хороши:
Также, как отметил Сергей в комментариях: ECMA-262 «Спецификация языка ECMAScript®», гласит:
Другими словами, последнее значение выигрывает.
Попытка синтаксического анализа строки с дублированными именами в реализации Java Дугласа Крокфорда (создателя JSON) приводит к исключению :
источник
d8 -e 'x={"a":1,"a":2}; print(x.a);'
это печатает 2.JSON.parse()
явно говоритIn the case where there are duplicate name Strings within an object, lexically preceding values for the same key shall be overwritten.
(другими словами, last-value-wins).Есть 2 документа, определяющих формат JSON:
Принятые ответы цитаты из 1-го документа. Я думаю, что первый документ более понятен, но второй содержит больше деталей.
Второй документ гласит:
Так что не запрещено иметь повторяющееся имя, но это не рекомендуется.
источник
Я сталкивался с подобным вопросом, когда имел дело с API, который принимает и XML, и JSON, но не документирует, как он будет обрабатывать то, что вы ожидаете от дублированных ключей в принятом JSON.
Ниже приведено правильное XML-представление вашего образца JSON:
Когда это преобразуется в JSON, вы получаете следующее:
Естественное сопоставление языка, который обрабатывает то, что вы могли бы назвать дублирующими ключами для другого, может послужить здесь потенциальным справочным материалом.
Надеюсь, что это помогает кому-то!
источник
Спецификация JSON гласит:
Важной частью здесь является «неупорядоченный»: он подразумевает уникальность ключей, потому что единственное, что вы можете использовать для ссылки на конкретную пару, это ее ключ.
Кроме того, большинство библиотек JSON десериализуют объекты JSON в хэш-карты / словари, где ключи гарантированно уникальны. Что произойдет, когда вы десериализуете объект JSON с дублирующимися ключами, зависит от библиотеки: в большинстве случаев вы либо получите ошибку, либо будет учтено только последнее значение для каждого дублированного ключа.
Например, в Python
json.loads('{"a": 1, "a": 2}')
возвращает{"a": 2}
.источник
{ (a,b), (a,c) }
это уникальный набор. Так что технически под определением json.org{"a":1,"a":2}
действует, но{"a":1,"a":2,"a":1}
это не так. Также обратите внимание, что ECMA-404 (действительный стандарт) избегает использования слова «набор»:An object structure is represented as a pair of curly bracket tokens surrounding zero or more name/value pairs.
Должен быть уникальным, не означает, что ДОЛЖЕН быть уникальным. Однако, как уже говорилось, некоторые парсеры не будут работать, а другие будут просто использовать последнее проанализированное значение. Однако, если бы спецификация была немного очищена, чтобы учесть дубликаты, я мог бы увидеть применение, где у вас может быть обработчик событий, который преобразует JSON в HTML или какой-то другой формат ... в таких случаях это было бы совершенно справедливо для Разобрать JSON и создать другой формат документа ...
может легко разобрать, например, HTML
Я вижу причину вопроса, но в его нынешнем виде ... я бы не стал доверять.
источник
{"div":{"p":"hello","p":"universe"}, "div":{"h1":"Heading 1","p":"another paragraph"}}
. Сейчас многие люди и фреймворки рассматривают объекты JSON как неупорядоченные словари, но JavaScript и, например, API MongoDB полагаются на упорядочение ключей в словарях, поэтому то, что вы предлагаете (упорядоченные словари), не случайно. Вам просто нужен специализированный парсер.Отвечая на цель, есть разные ответы:
Используя JSON для сериализации объектов (JavaScriptObjectNotation), каждый элемент словаря сопоставляется с индивидуальным свойством объекта, поэтому разные записи, определяющие значение для одного и того же свойства, не имеют смысла.
Тем не менее, я столкнулся с тем же вопросом из очень специфического варианта использования: при написании примеров JSON для тестирования API мне было интересно, как добавить комментарии в наш файл JSON, не нарушая удобство использования. Спецификация JSON не знает комментариев, поэтому я предложил очень простой подход:
Использовать дубликаты ключей для комментирования наших примеров JSON . Пример:
{ "property1" : "value1", "REMARK" : "... prop1 controls ...", "property2" : "value2", "REMARK" : "... value2 raises an exception ...", }
Сериализаторы JSON, которые мы используем, не имеют проблем с этими дубликатами «REMARK», и код нашего приложения просто игнорирует эти небольшие накладные расходы.
Таким образом, несмотря на то, что на прикладном уровне нет никакого смысла, эти дубликаты для нас предоставляют ценный обходной путь, позволяющий добавлять комментарии к нашим образцам тестирования, не нарушая удобство использования JSON.
источник
Отправка и ответ, потому что есть много устаревших идей и путаницы в отношении стандартов. По состоянию на декабрь 2017 года существует два конкурирующих стандарта:
RFC 8259 - https://tools.ietf.org/html/rfc8259
ECMA-404 - http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
json.org предлагает ECMA-404 является стандартом, но этот сайт не появляется , чтобы быть авторитетом. Хотя я думаю , что это справедливо считать ECMA Органа, что важно здесь есть, единственное различие между стандартами ( в отношении уникальных ключей) является то , что RFC 8259 говорит , что ключи должны быть уникальными, и ECMA-404 говорит , что они не обязаны быть уникальный.
RFC-8259:
Слово «следует» во всех подобных заглавных буквах имеет значение в мире RFC, которое определено в другом стандарте (BCP 14, RFC 2119 - https://tools.ietf.org/html/rfc2119 ) как,
ECMA-404:
Таким образом, независимо от того, как вы это нарезаете, это синтаксически допустимый JSON .
Причина, по которой дана уникальная ключевая рекомендация в RFC 8259, заключается в следующем:
Другими словами, с точки зрения RFC 8259, это допустимо, но ваш анализатор может прекратить, и нет никаких обещаний относительно того, какое значение, если оно есть, будет связано с этим ключом. С точки зрения ECMA-404 (которую я бы лично принял за авторитет), это действительно, точка. Для меня это означает, что любой парсер, который отказывается анализировать его, сломан. Следует хотя бы разобрать согласно обоим этим стандартам. Но то, как он превращается в ваш родной объект выбора, в любом случае, является уникальным ключом или нет, полностью зависит от среды и ситуации, и с самого начала ничего из этого не входит в стандарт.
источник
Это не определено в стандарте ECMA JSON . И вообще говоря, отсутствие определения в стандарте означает: «Не рассчитывайте, что это работает одинаково везде».
Если вы азартный игрок, «многие» движки JSON разрешат дублирование и просто используют последнее указанное значение. Это:
Становится так:
Но если вы не игрок, не рассчитывайте на это!
источник
Стандарт говорит так:
Ошибка, по крайней мере, в node.js. Этот код успешно выполняется в node.js.
источник
Согласно RFC-7159, действующему стандарту для JSON, опубликованному Инженерной рабочей группой по Интернету (IETF), говорится: «Имена внутри объекта ДОЛЖНЫ быть уникальными». Однако, согласно RFC-2119, который определяет терминологию, используемую в документах IETF, слово «должен» фактически означает «... могут существовать веские причины в определенных обстоятельствах игнорировать конкретный элемент, но следует понимать все последствия и тщательно взвесить, прежде чем выбрать другой курс ". По сути это означает, что, хотя рекомендуется иметь уникальные ключи, это не обязательно. Мы можем иметь дубликаты ключей в объекте JSON, и он все равно будет действительным.
Из практического применения я видел, что значение из последнего ключа рассматривается, когда дубликаты ключей находятся в JSON.
источник
В C #, если вы десериализуете в a,
Dictionary<string, string>
он принимает последнюю пару ключ-значение:если вы попытаетесь десериализовать
Вы получаете
Newtonsoft.Json.JsonSerializationException
исключение.источник