Czy to ważny Json?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/ mówi tak.
http://www.json.org/ nie mówi nic o zakazie.
Ale oczywiście nie ma to większego sensu, prawda? Większość implementacji prawdopodobnie korzysta z tablicy mieszającej, więc i tak jest ona zastępowana.
Dictionary<string, string>
Odpowiedzi:
Ze standardu (p. Ii) :
W dalszej części standardu (s. 2) specyfikacja obiektu JSON:
Nie wspomina o tym, że zduplikowane klucze są nieprawidłowe lub prawidłowe, więc zgodnie ze specyfikacją bezpiecznie zakładam, że oznacza to, że są dozwolone.
To, że większość implementacji bibliotek JSON nie akceptuje duplikatów kluczy, nie powoduje konfliktu ze standardem z powodu pierwszego cytatu.
Oto dwa przykłady związane ze standardową biblioteką C ++. Podczas deserializacji niektórych obiektów JSON w
std::map
sensowne byłoby odrzucenie duplikatów kluczy. Ale podczas deserializacji jakiegoś obiektu JSON wstd::multimap
sensowne byłoby normalne akceptowanie zduplikowanych kluczy.źródło
std::multimap
przykład, który właśnie dodałem. Może być serializowany jako obiekt JSON z potencjalnie zduplikowanymi kluczami.{"a":1,"a":2}
to zestaw dwóch odrębnych par klucz / wartość. Rzeczywiście, nawet{"a":1,"a":1}
można go traktować jako zestaw par klucz / wartość, który ma tylko jeden element. Powtarzanie tego można traktować jako dziwactwo składniowe. Lepszą definicją byłoby: „Obiekt jest funkcją częściową od ciągów (nazw) do wartości”.Krótka odpowiedź: tak, ale nie jest zalecana.
Długa odpowiedź: zależy od tego, co nazywacie ważnym ...
ECMA-404 „Składnia wymiany danych JSON” nie mówi nic o zduplikowanych nazwach (kluczach).
Jednak RFC 8259 „Format wymiany danych JavaScript (JSON)” mówi:
W tym kontekście NALEŻY rozumieć, jak określono w BCP 14 :
RFC 8259 wyjaśnia, dlaczego unikalne nazwy (klucze) są dobre:
Ponadto, jak zauważył Serguei w komentarzach: ECMA-262 „Specyfikacja języka ECMAScript®” brzmi:
Innymi słowy, ostatnia wartość wygrywa.
Próba przetworzenia ciągu o zduplikowanych nazwach z implementacją Java przez Douglasa Crockforda (twórcę JSON) powoduje wyjątek :
źródło
d8 -e 'x={"a":1,"a":2}; print(x.a);'
Drukuje 2.JSON.parse()
wyraźnie mówiIn the case where there are duplicate name Strings within an object, lexically preceding values for the same key shall be overwritten.
(innymi słowy last value-wins).Istnieją 2 dokumenty określające format JSON:
Przyjęta odpowiedź przytacza pierwszy dokument. Myślę, że pierwszy dokument jest bardziej przejrzysty, ale drugi zawiera więcej szczegółów.
Drugi dokument mówi:
Nie jest więc zabronione posiadanie zduplikowanej nazwy, ale jest odradzane.
źródło
Podobne pytanie natrafiłem na interfejs API, który akceptuje zarówno XML, jak i JSON, ale nie dokumentuje, w jaki sposób poradziłby sobie z tym, czego można oczekiwać od duplikatów kluczy w JSON.
Poniżej przedstawiono poprawną reprezentację XML przykładowego JSON:
Po przekonwertowaniu na JSON otrzymujesz:
Naturalne odwzorowanie z języka, który obsługuje to, co możesz nazwać duplikatami kluczy na inny, może służyć jako potencjalne źródło najlepszych praktyk.
Mam nadzieję, że komuś pomoże!
źródło
Specyfikacja JSON mówi:
Ważną częścią jest tutaj „nieuporządkowany”: implikuje wyjątkowość kluczy, ponieważ jedyną rzeczą, której można użyć w odniesieniu do konkretnej pary, jest jej klucz.
Ponadto większość bibliotek JSON usunie z szeregów obiekty JSON w postaci map haszowania / słowników, w których klucze są unikalne. Co stanie się, gdy deserializujesz obiekt JSON ze zduplikowanymi kluczami, zależy od biblioteki: w większości przypadków albo pojawi się błąd, albo tylko ostatnia wartość dla każdego zduplikowanego klucza zostanie wzięta pod uwagę.
Na przykład w Pythonie
json.loads('{"a": 1, "a": 2}')
zwraca{"a": 2}
.źródło
{ (a,b), (a,c) }
jest unikatowy zestaw. Więc technicznie zgodnie z definicją json.org{"a":1,"a":2}
jest poprawna, ale{"a":1,"a":2,"a":1}
nie jest. Należy również zauważyć, że ECMA-404 (aktualny standard) unika słowa „set”:An object structure is represented as a pair of curly bracket tokens surrounding zero or more name/value pairs.
POWINNY być unikalne, nie oznacza, że MUSI być wyjątkowe. Jednak, jak powiedziano, niektóre parsery zawiodą, a inne wykorzystają tylko ostatnią przeanalizowaną wartość. Jeśli jednak specyfikacja została nieco wyczyszczona, aby umożliwić tworzenie duplikatów, mógłbym zobaczyć zastosowanie, w którym możesz mieć moduł obsługi zdarzeń, który przekształca JSON na HTML lub inny format ... w takich przypadkach byłoby całkowicie poprawne przeanalizuj JSON i utwórz inny format dokumentu ...
może następnie łatwo parsować na przykład do HTML
Widzę uzasadnienie pytania, ale w obecnej formie ... nie ufałbym temu.
źródło
{"div":{"p":"hello","p":"universe"}, "div":{"h1":"Heading 1","p":"another paragraph"}}
. Teraz wiele osób i struktur traktuje obiekty JSON jako nieuporządkowane słowniki, ale JavaScript i np. API MongoDB polegają na porządkowaniu kluczy w słownikach, więc to, co sugerujesz (uporządkowane słowniki), nie jest niespotykane. Potrzebujesz tylko specjalistycznego parsera.Pytając o cel, istnieją różne odpowiedzi:
Używając JSON do serializacji obiektów (JavaScriptObjectNotation), każdy element słownika jest mapowany na indywidualną właściwość obiektu, więc różne wpisy definiujące wartość dla tej samej właściwości nie mają znaczenia.
Jednak trafiłem na to samo pytanie z bardzo konkretnego przypadku użycia: pisząc próbki JSON do testowania API, zastanawiałem się, jak dodać komentarze do naszego pliku JSON, nie przerywając użyteczności. Specyfikacja JSON nie zna komentarzy, więc wpadłem na bardzo proste podejście:
Aby użyć duplikatów kluczy, aby skomentować nasze próbki JSON . Przykład:
{ "property1" : "value1", "REMARK" : "... prop1 controls ...", "property2" : "value2", "REMARK" : "... value2 raises an exception ...", }
Serializatory JSON, których używamy, nie mają problemów z tymi duplikatami „UWAGA”, a nasz kod aplikacji po prostu ignoruje ten niewielki narzut.
Tak więc, mimo że nie ma żadnego znaczenia w warstwie aplikacji, te duplikaty stanowią dla nas cenne obejście pozwalające dodawać komentarze do naszych próbek testowych bez przerywania użyteczności JSON.
źródło
Publikowanie i odpowiadanie, ponieważ istnieje wiele nieaktualnych pomysłów i niejasności dotyczące standardów. Od grudnia 2017 r. Istnieją dwa konkurujące ze sobą standardy:
RFC 8259 - https://tools.ietf.org/html/rfc8259
ECMA-404 - http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
json.org sugeruje ECMA-404 jest standard, ale ta strona nie wydaje się być autorytetem. Chociaż uważam, że sprawiedliwe jest uznawanie ECMA za autorytet, ważne jest tutaj, jedyna różnica między standardami (dotycząca unikatowych kluczy) polega na tym, że RFC 8259 mówi, że klucze powinny być unikalne, a ECMA-404 mówi, że nie muszą być wyjątkowy.
RFC-8259:
Słowo „powinien” we wszystkich takich wersjach ma znaczenie w świecie RFC, które jest szczegółowo zdefiniowane w innym standardzie (BCP 14, RFC 2119 - https://tools.ietf.org/html/rfc2119 ), ponieważ:
ECMA-404:
Tak więc, bez względu na to, jak go pokroisz , jest on poprawny pod względem składniowym JSON .
Powodem podania unikalnej kluczowej rekomendacji w RFC 8259 jest:
Innymi słowy, z punktu widzenia RFC 8259 jest on poprawny, ale twój parser może się nie poddawać i nie ma obietnicy, która wartość, jeśli w ogóle, zostanie sparowana z tym kluczem. Z punktu widzenia ECMA-404 (który osobiście uważam za autorytet) jest to ważna kropka. Dla mnie oznacza to, że każdy analizator składni, który odmawia jego analizy, jest uszkodzony. Powinien przynajmniej parsować zgodnie z obydwoma standardami. Jednak sposób, w jaki zmienia się w wybrany obiekt natywny, jest, w każdym razie, unikalnymi kluczami, całkowicie zależnymi od środowiska i sytuacji, i na początku żaden z nich nie jest w standardzie.
źródło
Nie jest to zdefiniowane w standardzie ECMA JSON . I ogólnie mówiąc, brak definicji w standardzie oznacza: „Nie licz na to, że działa to tak samo wszędzie”.
Jeśli jesteś hazardzistą, „wiele” silników JSON pozwoli na powielanie i po prostu użyje ostatniej podanej wartości. To:
Staje się to:
Ale jeśli nie jesteś hazardzistą, nie licz na to!
źródło
Norma mówi:
Błąd znajduje się co najmniej w pliku node.js. Ten kod kończy się pomyślnie w node.js.
źródło
Według RFC-7159, obecny standard JSON opublikowany przez Internet Engineering Task Force (IETF), stwierdza: „Nazwy w obiekcie POWINNY być unikalne”. Jednak zgodnie z RFC-2119, która definiuje terminologię stosowaną w dokumentach IETF, słowo „powinno” w rzeczywistości oznacza „… mogą istnieć uzasadnione powody w szczególnych okolicznościach, aby zignorować określoną pozycję, ale należy w pełni zrozumieć i dokładnie zważony przed wyborem innego kursu. ” Zasadniczo oznacza to, że chociaż unikatowe klucze są zalecane, nie jest to konieczne. Możemy mieć zduplikowane klucze w obiekcie JSON i nadal byłby ważny.
Od praktycznego zastosowania widziałem, że wartość z ostatniego klucza jest brana pod uwagę, gdy duplikaty kluczy są znalezione w JSON.
źródło
W C #, jeśli deserializujesz do a
Dictionary<string, string>
, bierze ostatnią parę klucz-wartość:jeśli spróbujesz deserializować do
dostajesz
Newtonsoft.Json.JsonSerializationException
wyjątek.źródło