Pytanie Czy komentarze mogą być używane w JSON?


Czy mogę używać komentarzy w pliku JSON? Jeśli tak to jak?


5797
2017-10-28 20:39


pochodzenie


@StingyJack: Aby wyjaśnić rzeczy, które mogą nie być oczywiste lub cokolwiek innego można zrobić z komentarzami. Często mam komentarze w plikach danych. Pliki XML, ini i wiele innych formatów zawierają zapisy do komentarzy. - Michael Burr
Jeśli ty, tak jak ja, zastanawiasz się, czy //comments są w porządku dla konkretnego przypadku użycia pliku konfiguracji Sublime Text, odpowiedź brzmi "tak" (od wersji 2). Wysublimowany tekst przynajmniej nie będzie narzekał, podczas gdy będzie narzekać {"__comment": ...} w konsoli, ponieważ jest to nieoczekiwane pole. - hangtwenty
i być może jest to jeden z powodów, dla których powstał TOML .. - Alex Nolasco
Nieco noobish, ale próbowałem również używać // do komentarzy w JSON. Teraz zdaję sobie sprawę, że jest on ściśle wykorzystywany do wymiany / wymiany. Westchnienie! Nie mogę już komentować :( Życie jest skazane !. - Sid
JSON5 obsługuje komentarze: stackoverflow.com/a/7901053/108238 - schoetbi


Odpowiedzi:


Nie.

JSON powinien być danymi, a jeśli umieścisz komentarz, to też będą dane.

Można nazwać wyznaczony element danych "_comment" (lub coś), które byłyby ignorowane przez aplikacje korzystające z danych JSON.

Prawdopodobnie lepiej byłoby mieć komentarz w procesach, które generują / odbierają JSON, ponieważ powinni wiedzieć, jakie dane JSON będą z góry, lub przynajmniej ich strukturę.

Ale jeśli zdecydujesz się:

{
   "_comment": "comment text goes here...",
   "glossary": {
      "title": "example glossary",
      "GlossDiv": {
         "title": "S",
         "GlossList": {
            "GlossEntry": {
               "ID": "SGML",
               "SortAs": "SGML",
               "GlossTerm": "Standard Generalized Markup Language",
               "Acronym": "SGML",
               "Abbrev": "ISO 8879:1986",
               "GlossDef": {
                  "para": "A meta-markup language, used to create markup languages such as DocBook.",
                  "GlossSeeAlso": ["GML", "XML"]
               },
               "GlossSee": "markup"
            }
         }
      }
   }
}

4066
2017-10-28 21:01



Może się zdarzyć, że na faktycznym komentarzu pojawi się prefiks na wypadek, gdyby kiedykolwiek pojawiło się poprawne pole o nazwie komentarz: "__comment":"comment text goes here...", - Rob Fonseca-Ensor
Dość niedawne wyjaśnienie / uzasadnienie, dlaczego nie ma komentarzy w JSON (lub dokładniej, dlaczego zostały one usunięte wcześnie): plus.google.com/118095276221607585885/posts/RK8qyGVaGSr Zobacz także, tech.groups.yahoo.com/group/json/message/156 i inne dyskusje w tym wątku. - Michael Burr
BTW, biblioteka json dla Javy google-gsonma poparcie dla komentarzy. - centic
A jeśli chcę osobny komentarz do Accronym i Abbrev nieruchomości? Użyłem tego wzoru wcześniej, ale przestałem, ponieważ nie pozwala mi to zrobić. To jest hack. Być może, jeśli dodaję nazwę właściwości za pomocą __comment__ zamiast. To jest "__comment__Abbrev", wciąż hack, ale pozwolę mi skomentować wszystkie prpoerties - Juan Mendes
możesz również użyć "//": wygląda na bardziej natywny i nadal można go powtarzać w tym samym rodzica - smnbbrv


Nie, komentarze do formularza //… lub /*…*/ nie są dozwolone w JSON. Ta odpowiedź jest oparta na:

  • http://www.json.org
  • RFC 4627: The application/json Typ multimediów dla JavaScript Object Notation (JSON)
  • RFC 7159 Format wymiany danych JavaScript Object Notation (JSON) - Obsoletes: 4627, 7158

1569
2017-11-15 09:32



Jeśli chcesz opisać swój JSON za pomocą komentarzy (co czyni go nieprawidłowym JSON), zminimalizuj go przed analizą lub przesłaniem. Sam Crockford potwierdził to w 2012 roku w kontekście plików konfiguracyjnych. - toolbear
@alkuzad: Jeśli chodzi o gramatyki formalne, musi istnieć coś, co wyraźnie mówi o nich są dozwolone, a nie na odwrót. Na przykład, wybierz swój język programowania: Tylko dlatego, że niektóre pożądane (ale brakujące) funkcje nie są jawnie zabronione, nie oznacza to, że twój kompilator w magiczny sposób je rozpozna. - stakx
Tak. Format JSON ma dużo martwej przestrzeni między elementami i jest niewrażliwy na działanie przestrzeni w tych regionach, więc nie ma powodu, dla którego nie można wyświetlać komentarzy jedno- lub wielowierszowych. Wiele analizatorów składni i minifenderów obsługuje także komentarze JSON, więc upewnij się, że twój parser je obsługuje. JSON jest często używany do danych aplikacji i ustawień konfiguracyjnych, więc teraz komentarze są niezbędne. "Oficjalna specyfikacja" to niezły pomysł, ale jest ona niewystarczająca i przestarzała, tak szkoda. Zmniejsz swój JSON, jeśli niepokoisz się rozmiarem lub wydajnością. - Triynko
Chociaż twoja odpowiedź jest absolutnie poprawna, należy powiedzieć, że jest to BS. Przy tak dużej liczbie użytkowników końcowych, którzy potrzebują konfiguracji json, komentarze są niezwykle pomocne. Tylko dlatego, że niektóre kapelusze z folii aluminiowej zdecydowały, że JSON jest i zawsze musi być Czytelna maszynowo, ignorując fakt, że ludzie muszą ją czytać, to tylko parodia małej umysłowości. - cmroanirgo
@cmroanirgo: Oczywiście nie jesteście pierwszymi, którzy narzekają na to ograniczenie JSON ... dlatego mamy parsery, które cicho pozwalają na komentarze i inne formaty, takie jak YAML i JSON5. Jednak to nie zmienia faktu, że JSON jest tym, czym jest. Raczej uważam za interesujące, że ludzie zaczęli używać JSON-a do celów, w których z początku było niewystarczająco dużo, biorąc pod uwagę omawiane ograniczenie. Nie obwiniaj formatu JSON; obwiniać siebie za naleganie na używanie go tam, gdzie nie jest szczególnie dobrze dopasowany. - stakx


Dodaj komentarze, jeśli wybierzesz; usuń je za pomocą miniarki przed analizą lub przesłaniem.

Właśnie wydałem JSON.minify () która usuwa komentarze i spacje z bloku JSON i sprawia, że ​​jest to poprawny JSON, który można przeanalizować. Możesz więc użyć go tak:

JSON.parse(JSON.minify(my_str));

Kiedy ją wydałem, dostałem ogromny sprzeciw ludzi, którzy nie zgadzają się nawet z jej pomysłem, więc zdecydowałem, że napiszę obszerny post na blogu o tym, dlaczego komentarze mają sens w JSON. Zawiera ten znaczący komentarz od twórcy JSON:

Załóżmy, że używasz JSON do przechowywania plików konfiguracyjnych, które chcesz dodać do adnotacji. Śmiało i wstaw wszystkie komentarze, które lubisz. Następnie przeprowadź ją przez JSMin, zanim przekażesz go do swojego parsera JSON. - Douglas Crockford, 2012

Mam nadzieję, że jest to pomocne dla tych, którzy nie zgadzają się z tym, dlaczego JSON.minify () może być przydatne.


678
2018-06-23 18:20



Jedynym problemem jaki mam z JSON.minify () jest to, że jest naprawdę wolny. Zrobiłem więc własną implementację, która robi to samo: gist.github.com/1170297 . W przypadku niektórych dużych plików testowych implementacja zajmuje 74 sekundy, a moja 0,06 sekundy. - WizKid
byłoby świetnie, gdybyś mógł przesłać sugerowany algorytm alternatywny do repozytorium github dla JSON.minify (), aby mógł zostać przeniesiony do wszystkich obsługiwanych języków: github.com/getify/json.minify - Kyle Simpson
@MiniGod Już wielokrotnie słyszałem przemyślenia Douga na ten temat. Zwróciłem się do nich dawno temu w moim blogu: blog.getify.com/json-comments - Kyle Simpson
@ MarnenLaibow-Koser nadal istnieją poprawne zastosowania komentarzy, nawet w przypadku wykorzystania strumienia danych (lub nawet pakietu): włączenie metadanych diagnostycznych, takich jak czas utworzenia lub źródła, jest powszechnie stosowane w przypadku XML i jest całkowicie sensowne również dla danych JSON. Argumenty przeciwko komentarzom są płytkie, a każdy format danych tekstowych powinien zezwalać na komentarze, niezależnie od domniemanego, zamierzonego użycia (nic nie sugeruje, że JSON nie może być używany gdzie indziej, fwiw) - StaxMan
Jeśli JSON ma mieć powszechną akceptację (co w zasadzie robi), wówczas powinien mieć uniwersalne zastosowanie. Przykład: JSON może służyć jako plik konfiguracyjny aplikacji. Ta aplikacja wymagałaby komentarzy. - eggmatters


Komentarze zostały usunięte z projektu JSON.

Usunąłem komentarze od JSON, ponieważ widziałem, jak ludzie używali ich do przechowywania dyrektyw parsujących, praktyki, która zniszczyłaby interoperacyjność. Wiem, że brak komentarzy sprawia, że ​​niektórzy ludzie są smutni, ale nie powinni.

Załóżmy, że używasz JSON do przechowywania plików konfiguracyjnych, które chcesz dodać do adnotacji. Śmiało i wstaw wszystkie komentarze, które lubisz. Następnie przeprowadź ją przez JSMin, zanim przekażesz go do swojego parsera JSON.

Źródło: Publiczne oświadczenie Douglasa Crockforda w G +


379
2018-06-11 08:52



Myślałem, że JSON powinien być bardziej czytelny dla człowieka niż, powiedzmy, XML? Komentarze są dla czytelności. - intrepidis
W każdym razie możesz być niegrzeczny i dodać dyrektywy parsujące w JSON: {"__directives": {"# n #": "DateTime.Now"}, "validdate": "# n #"} ... Wygląda na YAML to droga naprzód ... - intrepidis
Osobista opinia: nie pozwalając na komentarze jest lame. Nie miałem innej możliwości niż zbudowanie niestandardowego analizatora składni JSON, który ignoruje komentarze, w celu odkodowania moich plików konfiguracyjnych. - caiosm1005
@ArturCzajka Wciąż nie podoba mi się to, że JSON nie obsługuje komentarzy, ale wypróbowałem INI i muszę przyznać, że rozsądniej jest używać ich w JSON-ie do plików konfiguracyjnych. Dziękuję za odpowiedź i mam nadzieję, że więcej osób zmieni zdanie, czytając tę ​​rozmowę. (zrobienie parsera i tak było bardziej ćwiczeniem :) - caiosm1005
To jak wymaganie, aby wszystkie rowery miały koła treningowe, ponieważ niektórzy ludzie nie mogą jeździć na rowerach. Usunięcie ważnej funkcji, ponieważ głupi ludzie nadużywają jej to zły projekt. Format danych powinien priorytetowo traktować użyteczność, jeśli chodzi o bycie idiotoodpornym. - Phil Goetz


OŚWIADCZENIE: TWOJA GWARANCJA JEST UNIKNĄCA

Jak już wspomniano, ten hack korzysta z implementacji specyfikacji. Nie wszystkie parsery JSON zrozumieją ten rodzaj JSON. Parsery strumieniowe w szczególności będą się dławić.

To interesująca ciekawość, ale ty naprawdę nie powinien go używać do czegokolwiek. Poniżej znajduje się oryginalna odpowiedź.


Znalazłem mały hack, który pozwala na umieszczanie komentarzy w pliku JSON, który nie ma wpływu na parsowanie, ani nie zmienia danych reprezentowanych w jakikolwiek sposób.

Wydaje się, że podczas deklarowania literału obiektu można określić dwie wartości tym samym kluczem, a ostatnia ma pierwszeństwo. Wierzcie lub nie, okazuje się, że parsery JSON działają w ten sam sposób. Możemy więc użyć tego do tworzenia komentarzy w źródłowym JSON, które nie będą obecne w analizowanej reprezentacji obiektu.

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1

Jeśli zastosujemy tę technikę, Twój skomentowany plik JSON może wyglądać tak:

{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}

Powyższy kod jest prawidłowy JSON. Jeśli go przeanalizujesz, otrzymasz obiekt taki jak ten:

{
    "api_host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}

Co oznacza, że ​​nie ma śladu komentarzy i nie będą mieć żadnych dziwnych efektów ubocznych.

Szczęśliwy hacking!


192
2017-08-02 13:46



Od Specyfikacja: Nazwy w obiekcie POWINNY być unikatowe. - Quentin
"wszystkie wdrożenia obsługują to samo" - Trudno to udowodnić. - Quentin
Kolejność elementów w JSON nie jest gwarantowana. Oznacza to, że "ostatni" przedmiot może się zmienić! - sep332
To wyraźnie narusza specyfikację (patrz wyżej), nie rób tego. ietf.org/rfc/rfc4627.txt?number=4627 - voidlogic
NIE - a co, jeśli parser przesyła strumieniowo? Co zrobić, jeśli analizator składni odczytuje go do słownika, w którym kolejność klawiszy jest niezdefiniowana? zabijcie to ogniem. - deanWombourne


JSON nie obsługuje komentarzy. Nigdy też nie zamierzano używać plików konfiguracyjnych, w których potrzebne byłyby komentarze.

Hjson to format pliku konfiguracyjnego dla ludzi. Zrelaksowana składnia, mniej błędów, więcej komentarzy.

Hjson intro

Widzieć hjson.org dla bibliotek JavaScript, Java, Python, PHP, Rust, Go, Ruby i C #.


123
2018-03-20 15:26



Rewizja. Jest to oczywiście dobra odmiana, nie otwarte osoby konserwatywne po prostu lubią nienawidzić. Mam nadzieję, że twoja implementacja zostanie poznana dalej - a może nawet stanie się bardziej popularna niż oryginał;) Mam nadzieję, że ktoś ją wdroży także z Ruby. @adelphus Dobrze zdefiniowany język to Twoja własna perspektywa lub opinia. Bycie konserwatywnym "deweloperem", jeśli jesteś jednym, nie dowodzi, że jesteś lepszy i możesz być jeszcze gorszy, utrzymując się w ograniczonej przestrzeni. Nie oceniaj ludzi jako okropnych deweloperów z łatwością. - konsolebox
Przepraszam za to, @konsolebox. Być może po lekturze możesz ponownie rozważyć swój "dobrze zdefiniowany pogląd JSON to Twoja opinia" ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf To prawdziwy standard, a deweloperzy wdrażający własne "specjalne" wersje prowadzą do fragmentacji, zamieszania i straconego czasu. Popatrzmy na twórców stron internetowych, z którymi mamy do czynienia podczas pisania kodu, ponieważ każda przeglądarka implementuje nieco inne wersje standardów. Język JSON może nie być idealny, ale fragmentacja jest gorsza. I tak, to tylko opinia i możesz się z tym nie zgodzić. - adelphus
Podziwiam twoją przyjemność, ale trochę wracasz do YAML. Jeśli chcesz dużo elastyczności i czytelności, użyj YAML (w rzeczywistości: stackoverflow.com/questions/450399/...) lub trzymaj się kurczowo, ale jednoznacznie JSON. - toolbear
Uważam, że najbardziej przyjazny dla użytkownika format konfiguracji to nadal INI. Jest prosty i niezbyt złożony w składni. Dzięki temu jest mniej onieśmielający dla użytkowników, którzy po prostu zanurzają palce w stawie konfiguracyjnym. - Matt
Kiedykolwiek potrzebujesz json jako config (gdzie komentarze są potrzebne) - nadaj plikowi nazwę ".js" zamiast ".json". js może oczywiście obsługiwać dowolny poprawny obiekt json i dodatkowo mogą obsłużyć komentarze. To jest powód, dla którego jest to "webpack.config.js", a nie "webpack.config.json" (jest jeszcze wiele innych powodów takiego działania w pakiecie internetowym: P) - jebbie


Nie możesz. Przynajmniej to moje doświadczenie z szybkiego spojrzenia json.org.

JSON ma swoją składnię wizualizowaną na tej stronie. Nie ma żadnej uwagi na temat komentarzy.


95
2017-10-28 20:42





Rozważ użycie YAML. To prawie nadzbiór JSON (praktycznie wszystkie poprawne JSON jest poprawne YAML) i pozwala na komentarze.


86
2017-08-31 02:24



@ g33kz0r Prawidłowo, stąd mój opis YAML jako bliskiego nadzbioru JSON. - Marnen Laibow-Koser
@NateS Wiele osób już wskazało, że odpowiedź brzmi "nie". Zaproponowałem lepszy sposób osiągnięcia celu PO. To jest odpowiedź. - Marnen Laibow-Koser
Wada: yaml biblioteka nie jest dostarczana z Pythonem. - Bleeding Fingers
@BleedingFingers Więc zainstaluj ... - Marnen Laibow-Koser
@ marnen-laibow-koser: tak, to musiała być niekompetencja, aby korzystać z dostępnych bibliotek YAML dla Javy i Perla i oczekiwać, że YAML wyprodukowany przez każdą z nich zostanie zużyty przez drugą bez błędu. To współdziałanie YAML było problemem, ale współdziałanie JSON nie było, jest całkowicie wyjaśnione przez mój brak wiedzy. - toolbear


Powinieneś napisać a Schemat JSON zamiast. Schemat JSON jest obecnie proponowanym internetowym projektem specyfikacji. Oprócz dokumentacji schematu można również używać do sprawdzania poprawności danych JSON.

Przykład:

{
    "description":"A person",
    "type":"object",
    "properties":
        {
            "name":
                {
                    "type":"string"
                },
            "age":
                {
                    "type":"integer",
                    "maximum":125
                }
        }
}

Możesz dostarczyć dokumentację za pomocą opis atrybut schematu.


55
2017-07-28 18:38



Czy schemat JSON żyje? Istnieje, ale czy jest obsługiwana przez jakąkolwiek znaną bibliotekę? - Munhitsu
tak json-schema google group jest dość aktywny i polecam JSV dla dobrej implementacji JavaScriptu walidatora schematów JSON. - raffel
Pomaga to w przypadku dokumentacji złożonej, a nie ad-hoc - Juan Mendes
Jeśli używasz clojure (i jestem pewien, że tego nie robisz), istnieje tutaj dość dobrze opisany parser schematu JSON o otwartym kodzie źródłowym: github.com/bigmlcom/closchema - charleslparker
@Munhitsu Manatee.Json (.Net) szeroko obsługuje schemat JSON. - gregsdennis


Jeśli używasz Jackson jako Twój analizator składni JSON, w ten sposób włączasz go, aby zezwalać na komentarze:

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);   

Następnie możesz mieć takie komentarze:

{
  key: "value" // comment
}

Możesz także mieć komentarze zaczynające się od # przez ustawienie:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);    

Ale ogólnie (jak już wcześniej udzielono odpowiedzi) specyfikacja nie zezwala na komentarze.


51
2018-02-06 20:44



Otwarcie tego linku przekroczyło limit czasu, gdy go wypróbowałem: The connection to the server was reset while the page was loading. - Peter Mortensen