I commenti possono essere utilizzati in JSON?


7613

Posso usare i commenti all'interno di un file JSON? Se é cosi, come?


153
@StingyJack: per spiegare cose che potrebbero non essere ovvie o qualsiasi altra cosa si possa fare con i commenti. Io per primo ho spesso commenti nei file di dati. XML, file ini e molti altri formati includono disposizioni per i commenti.
Michael Burr,

24
Se, come me, ti stavi chiedendo se //commentssei OK per il caso d'uso specifico di un file di configurazione di Sublime Text, la risposta è sì (dalla versione 2). Sublime Text non se ne lamenterà, almeno, mentre si lamenterà {"__comment": ...}nella console, perché è un campo inaspettato.
driftcatcher

8
e forse questo è uno dei motivi per cui TOML è stato creato ..
Alex Nolasco,

10
Leggermente noobish ma, ho anche provato a usare // per i commenti in JSON. Ora mi rendo conto che è strettamente utilizzato per interscambio / scambio. Sospiro! Non posso più commentare :(. La vita è condannata !.
Sid

12
JSON5 supporta commenti: stackoverflow.com/a/7901053/108238
schoetbi

Risposte:


5596

No.

I JSON dovrebbero essere tutti dati, e se includi un commento, anche questi saranno dati.

Potresti avere un elemento di dati designato chiamato "_comment"(o qualcosa del genere) che verrebbe ignorato dalle app che utilizzano i dati JSON.

Probabilmente sarebbe meglio avere il commento nei processi che generano / ricevono il JSON, in quanto dovrebbero sapere quali saranno i dati JSON in anticipo, o almeno la loro struttura.

Ma se hai deciso di:

{
   "_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"
            }
         }
      }
   }
}

232
Potrebbe essere utile avere una sorta di prefisso sul commento effettivo nel caso in cui ci sia mai un campo valido chiamato commento:"__comment":"comment text goes here...",
Rob Fonseca-Ensor,

19
A proposito, la libreria json per Java google-gson ha il supporto per i commenti.
Centic

11
E se volessi un commento separato sulle proprietà Accronyme Abbrev? Ho usato questo modello prima ma mi sono fermato poiché non mi permette di farlo. È un trucco. Forse se antepongo invece un nome di proprietà __comment__. Questo è "__comment__Abbrev", ancora un trucco, ma mi farebbe commentare tutte le prpoerties
Juan Mendes,

41
potresti anche usare "//": sembra più nativo ed è ancora ripetibile nello stesso genitore
smnbbrv,

4
Quando JSON viene utilizzato per i file di configurazione destinati all'uomo, devono essere annotati affinché gli umani possano capire meglio. Annotato, tale file non è più valido JSON, ma ci sono soluzioni. Ad esempio, GYP di Google supporta i commenti in stile #. JSON.Minify ti aiuterà a scartare i commenti in stile C / C ++ dal tuo file di input.
Петър Петров

1842

No , i commenti del modulo //…o /*…*/non sono consentiti in JSON. Questa risposta si basa su:

  • http://www.json.org
  • RFC 4627 : il application/jsontipo di supporto per JavaScript Object Notation (JSON)
  • RFC 8259 Formato di interscambio di dati JSON (JavaScript Object Notation) (sostituisce gli RFC 4627, 7158, 7159)

67
Se desideri annotare il tuo JSON con commenti (rendendolo quindi non valido JSON), quindi minimizzalo prima di analizzare o trasmettere. Lo stesso Crockford lo ha riconosciuto nel 2012 nel contesto dei file di configurazione.
toolbear,

25
@alkuzad: quando si tratta di grammatiche formali, ci deve essere qualcosa che dice esplicitamente che sono permesse, non viceversa. Ad esempio, prendi il tuo linguaggio di programmazione preferito: solo perché alcune funzionalità desiderate (ma mancanti) non sono esplicitamente vietate, non significa che il tuo compilatore lo riconoscerà magicamente.
stakx - non contribuisce più al

5
Sì. Il formato JSON ha un sacco di spazio morto tra gli elementi ed è insensibile allo spazio in quelle regioni, quindi non c'è motivo per cui non si possano avere commenti a linea singola o multilinea. Molti parser e minificatori supportano anche i commenti JSON, quindi assicurati che il tuo parser li supporti. JSON è molto utilizzato per i dati dell'applicazione e le impostazioni di configurazione, quindi ora sono necessari commenti. La "specifica ufficiale" è una buona idea, ma è insufficiente e obsoleta, quindi troppo male. Minimizza il tuo JSON se sei preoccupato per le dimensioni o le prestazioni del payload.
Triynko,

58
Sebbene la tua risposta sia assolutamente corretta, va detto che si tratta di BS. Con così tanti utenti finali che incontrano la necessità di una configurazione JSON, i commenti sono estremamente utili. Solo perché alcuni cappelli di stagnola hanno deciso che JSON è e deve essere sempre leggibile da una macchina, ignorando il fatto che gli umani devono leggerlo, è una parodia di poca mentalità.
cmroanirgo,

18
@cmroanirgo: Ovviamente non sei il primo a lamentarsi di quella limitazione di JSON ... ecco perché abbiamo parser che permettono silenziosamente commenti e altri formati come YAML e JSON5. Tuttavia, ciò non cambia il fatto che JSON è quello che è. Piuttosto, trovo interessante che le persone abbiano iniziato a utilizzare JSON per scopi in cui chiaramente non era sufficiente in primo luogo, vista la limitazione in questione. Non dare la colpa al formato JSON; incolpiamo noi stessi per aver insistito per usarlo dove non è particolarmente adatto.
stakx - non contribuisce più al

802

Includi commenti se lo desideri; rimuoverli con un minificatore prima di analizzare o trasmettere.

Ho appena rilasciato JSON.minify () che rimuove i commenti e gli spazi bianchi da un blocco di JSON e rende valido JSON che può essere analizzato. Quindi, potresti usarlo come:

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

Quando l'ho pubblicato, ho avuto un enorme contraccolpo di persone in disaccordo con l'idea, quindi ho deciso di scrivere un post sul blog completo sul perché i commenti abbiano un senso in JSON . Include questo notevole commento del creatore di JSON:

Supponiamo che tu stia utilizzando JSON per conservare i file di configurazione, che desideri annotare. Vai avanti e inserisci tutti i commenti che ti piacciono. Quindi reindirizzalo attraverso JSMin prima di passarlo al tuo parser JSON. - Douglas Crockford, 2012

Speriamo che sia utile a coloro che non sono d'accordo con il motivo per cui JSON.minify () potrebbe essere utile.


153
L'unico problema che ho con JSON.minify () è che è davvero molto lento. Quindi ho realizzato la mia implementazione che fa la stessa cosa: gist.github.com/1170297 . Su alcuni file di test di grandi dimensioni l'implementazione richiede 74 secondi e il mio 0,06 secondi.
WizKid,

56
sarebbe bello se potessi inviare l'algoritmo alternativo suggerito al repository github per JSON.minify (), in modo che possa essere portato su tutti i lang supportati: github.com/getify/json.minify
Kyle Simpson,

16
@MiniGod Ho già sentito molte volte le riflessioni di Doug su questo argomento. Li ho affrontati molto tempo fa nel mio post sul blog: blog.getify.com/json-comments
Kyle Simpson,

18
@ MarnenLaibow-Koser ci sono ancora usi validi per i commenti anche per l'utilizzo del flusso di dati (o anche dei pacchetti): l'inclusione di metadati diagnostici come i tempi di creazione o le fonti è un uso comune con XML e perfettamente sensato anche per i dati JSON. Le argomentazioni contro i commenti sono superficiali e qualsiasi formato di dati testuali dovrebbe consentire commenti, indipendentemente dall'uso implicito previsto (nulla indica che JSON non possa essere usato altrove, prima)
StaxMan

18
Se JSON deve avere un'accettazione universale (cosa che sostanzialmente fa), allora dovrebbe avere un'applicazione universale. Esempio: JSON può fungere da file di configurazione dell'applicazione. Questa applicazione vorrebbe commenti.
Eggmatters

441

I commenti sono stati rimossi da JSON in base alla progettazione.

Ho rimosso i commenti da JSON perché ho visto che le persone li stavano usando per tenere direttive di analisi, una pratica che avrebbe distrutto l'interoperabilità. So che la mancanza di commenti rende alcune persone tristi, ma non dovrebbe.

Supponiamo che tu stia utilizzando JSON per conservare i file di configurazione, che desideri annotare. Vai avanti e inserisci tutti i commenti che ti piacciono. Quindi reindirizzalo attraverso JSMin prima di passarlo al tuo parser JSON.

Fonte: dichiarazione pubblica di Douglas Crockford su G +


198
Pensavo che JSON avrebbe dovuto essere più leggibile dall'uomo rispetto, per esempio, a XML? I commenti sono per leggibilità.
intrepidis,

25
Ad ogni modo, potresti essere cattivo e aggiungere direttive di analisi in JSON: {"__directives": {"# n #": "DateTime.Now"}, "validdate": "# n #"} ... Sembra YAML è la via da seguire quindi ...
intrepidis

73
Opinione personale: non consentire commenti IS zoppo. Non avevo altra scelta se non quella di creare un parser JSON non standard che ignorasse i commenti, per decodificare i miei file di configurazione.
caiosm1005,

17
@ArturCzajka Non mi piace ancora il fatto che JSON non supporti i commenti, ma ho provato INI e devo ammettere che ha molto più senso usarli su JSON per i file di configurazione. Grazie per la risposta e si spera che più persone cambieranno idea mentre leggono questa conversazione. (fare un parser è stato più che altro un esercizio :)
caiosm1005

77
È come richiedere a tutte le biciclette di avere le ruote di allenamento perché alcune persone non possono andare in bicicletta. Rimuovere una caratteristica importante perché le persone stupide abusano di questo è un cattivo design. Un formato di dati dovrebbe privilegiare l'usabilità piuttosto che essere a prova di idiota.
Phil Goetz,

205

DISCLAIMER: LA TUA GARANZIA È NULLA

Come è stato sottolineato, questo trucco sfrutta l'implementazione delle specifiche. Non tutti i parser JSON capiranno questo tipo di JSON. I parser in streaming, in particolare, soffocano.

È una curiosità interessante, ma non dovresti davvero usarlo per niente . Di seguito è la risposta originale.


Ho trovato un piccolo trucco che ti consente di inserire commenti in un file JSON che non influirà sull'analisi o alterare i dati rappresentati in alcun modo.

Sembra che quando si dichiara un oggetto letterale è possibile specificare due valori con la stessa chiave e l'ultimo ha la precedenza. Che ci crediate o no, si scopre che i parser JSON funzionano allo stesso modo. Quindi possiamo usarlo per creare commenti nel JSON di origine che non saranno presenti in una rappresentazione di oggetto analizzata.

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

Se applichiamo questa tecnica, il tuo file JSON commentato potrebbe apparire così:

{
  "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]
}

Il codice sopra è JSON valido . Se lo analizzi, otterrai un oggetto come questo:

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

Ciò significa che non ci sono tracce dei commenti e che non avranno strani effetti collaterali.

Happy hacking!


150
Dalla specifica : I nomi all'interno di un oggetto DOVREBBERO essere univoci.
Quentin,

113
"tutte le implementazioni lo gestiscono allo stesso modo" - È una cosa difficile da dimostrare.
Quentin,

91
L'ordine degli elementi in JSON non è garantito. Ciò significa che "l'ultimo" oggetto potrebbe cambiare!
sep332

66
Ciò viola chiaramente le specifiche (vedere i commenti sopra), non farlo. ietf.org/rfc/rfc4627.txt?number=4627
voidlogic

334
NO - cosa succede se il parser è in streaming? Cosa succede se il parser lo legge in un dizionario in cui l'ordinamento delle chiavi non è definito? uccidilo con il fuoco .
deanWombourne,

183

JSON non supporta i commenti. Inoltre, non è mai stato progettato per essere utilizzato per i file di configurazione in cui sarebbero necessari commenti.

Hjson è un formato di file di configurazione per l'uomo. Sintassi rilassata, meno errori, più commenti.

Introduzione di Hjson

Vedi hjson.org per le librerie JavaScript, Java, Python, PHP, Rust, Go, Ruby e C #.


13
Upvoted. È ovviamente una buona variazione che i conservatori non aperti adorerebbero solo odiare. Spero che la tua implementazione venga ulteriormente conosciuta - e forse anche più popolare dell'originale;) Spero che qualcuno riesca a implementarla anche con Ruby. @adelphus La lingua ben definita è la tua prospettiva o opinione. Essere uno "sviluppatore" conservatore, se lo sei, non dimostra che tu sia migliore e che potresti essere anche peggio, tenendoti rinchiuso in spazi limitati. Non giudicare facilmente le persone come terribili sviluppatori.
Konsolebox

7
Mi dispiace, @konsolebox. Forse potresti riconsiderare la tua visione "ben definita JSON è la tua opinione" dopo aver letto ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf È uno standard reale e gli sviluppatori che implementano le proprie versioni "speciali" porta a frammentazione, confusione e molto tempo sprecato. Guarda il disordine che gli sviluppatori web hanno lasciato quando scrivono codice solo perché ogni browser implementa versioni leggermente diverse di standard. Il linguaggio JSON potrebbe non essere perfetto, ma la frammentazione è peggiore. E sì, questa è solo un'opinione e sei libero di non essere d'accordo.
Adelphus,

22
Ammiro il tuo talento, ma stai un po 'reinventando YAML. Se vuoi un sacco di flessibilità e leggibilità umana, usa YAML (non in realtà: stackoverflow.com/questions/450399/… ) o mantieni la bontà, ma inequivocabile JSON.
toolbear,

4
Trovo che il formato di configurazione più intuitivo sia ancora INI. È semplice e non molto sintassi pesante. Questo lo rende meno intimidatorio per gli utenti che immergono le dita dei piedi nel laghetto di configurazione.
Matt,

14
Ogni volta che hai bisogno di json come config (dove sono necessari commenti ) - dai un nome al tuo file ".js" invece di ".json" .. js può ovviamente gestire qualsiasi oggetto json valido e può anche gestire i commenti .. Questo è il motivo per cui è "webpack.config.js" e non "webpack.config.json" (beh, ci sono molte più ragioni anche per questo nel webpack: P)
jebbie,

122

Prendi in considerazione l'utilizzo di YAML. È quasi un superset di JSON (praticamente tutto JSON valido è YAML valido) e consente commenti.


12
@ g33kz0r Corretto, quindi la mia descrizione di YAML come quasi superset di JSON.
Marnen Laibow-Koser,

12
@NateS Molte persone avevano già sottolineato che la risposta era no. Ho suggerito un modo migliore per raggiungere l'obiettivo del PO. Questa è una risposta
Marnen Laibow-Koser,

5
Unico inconveniente: la yamllibreria non viene fornita con Python.
Bleeding Fingers,

6
@ marnen-laibow-koser: sì, deve essere stata incompetenza usare le librerie YAML disponibili per Java e Perl e aspettarsi che lo YAML prodotto da ciascuna venga consumato dall'altro senza errori. Che l'interoperabilità con YAML fosse un problema, ma l'interoperabilità con JSON non lo era, è interamente spiegato dalla mia mancanza di conoscenza.
toolbear,

3
@ marnen-laibow-koser, è meglio un formato che realizza la stessa cosa con una specifica più semplice. Un formato pragmatico con implementazioni perfette è meglio di un formato ideale con implementazioni imperfette. Non tutta la colpa per lib lib difettose è sulle spalle degli implementatori; la specifica YAML è lunga, densa e ottusa. La sua voce di Wikipedia cita due esempi di ambiguità; se uno deve mettere un emettitore tra un essere umano e il formato per proteggerli dalle ambiguità, il formato perde la sua pretesa di essere umano. JSON afferma di meno e soprattutto riesce dove YAML afferma di più e non è all'altezza.
toolbear,

108

Non puoi. Almeno questa è la mia esperienza da una rapida occhiata a json.org .

JSON ha la sua sintassi visualizzata su quella pagina. Non ci sono note sui commenti.


67

I commenti non sono uno standard ufficiale, sebbene alcuni parser supportino i commenti in stile C ++. Uno che uso è JsonCpp . Negli esempi c'è questo:

// Configuration options
{
    // Default encoding for text
    "encoding" : "UTF-8",

    // Plug-ins loaded at start-up
    "plug-ins" : [
        "python",
        "c++",
        "ruby"
        ],

    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
}

jsonlint non lo convalida. Quindi i commenti sono un'estensione specifica del parser e non standard.

Un altro parser è JSON5 .

Un'alternativa a JSON TOML .

Un'ulteriore alternativa è JSONC .


Groovy ha alcune classi integrate per la gestione di JSON . JsonSlurper può gestire i commenti. Naturalmente, i commenti non sono consentiti nelle specifiche ufficiali, quindi questo comportamento in qualsiasi parser è non standard e non portatile.
izrik,

Newtonsoft Json.NET supporta anche i commenti in stile C senza problemi
Max

66

Dovresti invece scrivere uno schema JSON . Lo schema JSON è attualmente una proposta di bozza di Internet proposta. Oltre alla documentazione, lo schema può essere utilizzato anche per la convalida dei dati JSON.

Esempio:

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

È possibile fornire documentazione utilizzando l' attributo dello schema di descrizione .


5
Lo schema JSON è vivo? Esiste ma è supportato da qualche libreria conosciuta?
Munhitsu,

1
sì, il gruppo google json-schema è abbastanza attivo e consiglierei JSV per una buona implementazione JavaScript di un validatore di schemi JSON.
Raffel

5
Questo aiuta solo con la documentazione strutturata, non con la documentazione ad hoc
Juan Mendes,

Se usi clojure (e sono sicuro di no) c'è un parser di schemi JSON open source con caratteristiche ragionevoli qui: github.com/bigmlcom/closchema
charleslparker

@Munhitsu Manatee.Json (.Net) supporta ampiamente lo schema JSON.
Gregregdennis il

64

Se stai usando Jackson come parser JSON, ecco come abilitarlo per consentire i commenti:

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

Quindi puoi avere commenti come questo:

{
  key: "value" // Comment
}

E puoi anche avere commenti che iniziano #impostando:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

Ma in generale (come già detto in precedenza) la specifica non consente commenti.


50

Ecco cosa ho trovato nella documentazione di Google Firebase che ti consente di inserire commenti in JSON:

{
  "//": "Some browsers will use this to enable push notifications.",
  "//": "It is the same for all projects, this is not your project's sender ID",
  "gcm_sender_id": "1234567890"
}

Cordiali saluti, Firebase Realtime Database non consente l'uso di '/' in una chiave. quindi questa può essere una bella convenzione per il tuo uso personale, ma non puoi farlo in Firebase
gutte

5
Questo metodo rompe alcune librerie, che richiedono che la chiave sia univoca. Sto risolvendo il problema numerando i commenti.
MovGP0,

buon commento, ho trovato questa domanda su SO ... questa parte sembra non essere coperta dalle specifiche stackoverflow.com/questions/21832701/…
mana

4
Tendo a usarlo in questo modo al giorno d'oggi: {"// foo": "foo comment", "foo": "foo value", "// bar": "bar comment", "bar": "bar value"} Puoi utilizzare un array per più commenti: {"// foo": ["foo comment 1", "foo comment 2"], "foo": '' foo value "}
MovGP0

47

NO . JSON era solito supportare i commenti, ma venivano abusati e rimossi dallo standard.

Dal creatore di JSON:

Ho rimosso i commenti da JSON perché ho visto che le persone li stavano usando per tenere direttive di analisi, una pratica che avrebbe distrutto l'interoperabilità. So che la mancanza di commenti rende alcune persone tristi, ma non dovrebbe. - Douglas Crockford, 2012

Il sito ufficiale JSON è su JSON.org . JSON è definito come standard da ECMA International. Esiste sempre una procedura di petizione per la revisione degli standard. È improbabile che le annotazioni vengano aggiunte allo standard JSON per diversi motivi.

JSON di progettazione è un'alternativa facilmente XML (parsed umana) all'XML. È semplificato al punto che le annotazioni non sono necessarie. Non è nemmeno un linguaggio di markup. L'obiettivo è la stabilità e l'interoperabilità.

Chiunque capisca la relazione "has-a" dell'orientamento agli oggetti può comprendere qualsiasi struttura JSON - questo è il punto. È solo un grafico aciclico diretto (DAG) con tag di nodo (coppie chiave / valore), che è una struttura di dati quasi universale.

Questa unica annotazione richiesta potrebbe essere "// Questi sono tag DAG". I nomi delle chiavi possono essere tanto istruttivi quanto richiesto, consentendo un'arità semantica arbitraria.

Qualsiasi piattaforma può analizzare JSON con poche righe di codice. XML richiede librerie OO complesse che non sono praticabili su molte piattaforme.

Le annotazioni renderebbero JSON meno interoperabile. Non c'è nient'altro da aggiungere, a meno che ciò di cui hai veramente bisogno sia un linguaggio di markup (XML), e non importa se i tuoi dati persistenti possono essere facilmente analizzati.

MA come ha osservato anche il creatore di JSON, c'è sempre stato il supporto della pipeline JS per i commenti:

Vai avanti e inserisci tutti i commenti che ti piacciono. Quindi reindirizzalo attraverso JSMin prima di passarlo al tuo parser JSON. - Douglas Crockford, 2012


37

Se il tuo file di testo, che è una stringa JSON, verrà letto da qualche programma, quanto sarebbe difficile rimuovere i commenti in stile C o C ++ prima di usarlo?

Risposta: sarebbe una fodera. In tal caso, i file JSON potrebbero essere utilizzati come file di configurazione.


1
Probabilmente il miglior suggerimento finora, sebbene sia ancora un problema per mantenere i file come formato di interscambio, poiché hanno bisogno di pre-elaborazione prima dell'uso.
Orbling

Sono d'accordo e ho scritto un parser JSON in Java, disponibile su www.SoftwareMonkey.org, che fa esattamente questo.
Lawrence Dol,

2
Nonostante penso, non è una buona idea estendere JSON (senza chiamarlo un diverso formato di scambio): assicurati di ignorare i "commenti" all'interno delle stringhe. {"foo": "/ * Questo non è un commento. * /"}
stofl

27
"... sarebbe una riga" umm, no, in realtà, JSON non è una grammatica regolare in cui un'espressione regolare può semplicemente trovare coppie corrispondenti di / *. Devi analizzare il file per trovare se un / * appare all'interno di una stringa (e ignorarlo), o se è scappato (e ignorarlo), ecc. Inoltre, la tua risposta non è utile perché speculi semplicemente (erroneamente) piuttosto che fornire qualsiasi soluzione.
Kyle Simpson l'

1
Cosa ha detto @ kyle-simpson. Inoltre, è troppo modesto per indirizzare i lettori alla propria risposta sull'utilizzo di JSON.minify come alternativa alle regexps ad hoc. Fallo, non questo.
toolbear,

36

Se si utilizza la libreria Newtonsoft.Json con ASP.NET per leggere / deserializzare è possibile utilizzare i commenti nel contenuto JSON:

// "name": "string"

// "id": int

o

/* Questo è un

esempio di commento * /

PS: i commenti a riga singola sono supportati solo con oltre 6 versioni di Newtonsoft Json.

Nota aggiuntiva per le persone che non riescono a pensare fuori dagli schemi: utilizzo il formato JSON per le impostazioni di base in un'applicazione Web ASP.NET che ho creato. Ho letto il file, lo converto nell'oggetto settings con la libreria Newtonsoft e lo utilizzo quando necessario.

Preferisco scrivere commenti su ogni singola impostazione nel file JSON stesso e non mi interessa davvero l'integrità del formato JSON purché la libreria che uso sia OK con esso.

Penso che questo sia un modo "più facile da usare / comprendere" piuttosto che creare un file "settings.README" separato e spiegare le impostazioni in esso.

Se hai un problema con questo tipo di utilizzo; scusa, il genio è fuori dalla lampada. Le persone troverebbero altri usi per il formato JSON e non c'è niente che tu possa fare al riguardo.


È difficile capire perché qualcuno abbia problemi a dichiarare un fatto.
dvdmn,

Suppongo che qualcuno abbia fatto un'eccezione perché quanto sopra non è più JSON o JSON non è valido. Forse l'aggiunta di un breve disclaimer potrebbe placare.
toolbear,

5
Sono completamente d'accordo con te, eppure ci sono 883 voti finora per la non risposta che afferma semplicemente l'ovvio. Purezza ideologica valutata al di sopra di informazioni utili, è COSÌ per te.
Giovanni,

Il punto è che un file con commenti non è JSON e non verrà analizzato da molte librerie JSON. Sentiti libero di fare quello che vuoi nel tuo programma, ma un file con commenti non è JSON. Se lo affermi, le persone proveranno ad analizzarlo con la loro lingua / libreria preferita e falliranno. È come chiedere se è possibile utilizzare parentesi quadre anziché parentesi angolari in XML. Puoi fare quello che vuoi ma non sarà più XML.
Gman

32

L'idea alla base di JSON è quella di fornire un semplice scambio di dati tra applicazioni. Questi sono in genere basati sul Web e la lingua è JavaScript.

In realtà non consente i commenti in quanto tali, tuttavia, passare un commento in quanto una delle coppie nome / valore nei dati funzionerebbe sicuramente, sebbene quei dati debbano ovviamente essere ignorati o gestiti in modo specifico dal codice di analisi.

Detto questo, non è intenzione che il file JSON contenga commenti in senso tradizionale. Dovrebbero essere solo i dati.

Dai un'occhiata al sito Web JSON per maggiori dettagli.


17
È vero che il formato JSON non ha commenti. Personalmente penso che sia un errore significativo - la capacità di avere commenti come metadati (non dati) è una cosa molto utile con xml. Le versioni precedenti della bozza della specifica JSON includevano commenti, ma per qualche motivo sono state eliminate. : - /
StaxMan

4
@StaxMan sono stati eliminati esattamente perché le persone hanno iniziato a usarli come metadati. Crockford ha detto che ha interrotto la compatibilità per ciò che è stato progettato il formato, e sono d'accordo: se vuoi i metadati, perché non includerlo come dati reali? È ancora più semplice analizzare in questo modo.
Camilo Martin,

6
I metadati appartengono a costrutti di metadati (ad esempio tag HTML <meta>), non commenti. Abusare dei commenti per i metadati è solo un trucco usato dove non esiste un vero costrutto di metadati.
Marnen Laibow-Koser,

Questo è esattamente il motivo per cui è stato eliminato: i commenti utilizzati come metadati interrompono l'interoperabilità. Dovresti semplicemente archiviare i tuoi metadati anche come JSON.
Gaborous,

1
Questa risposta è ridondante con risposte scritte migliori, con voti più alti, che dicono essenzialmente la stessa cosa, anche se questo potrebbe essere stato scritto in precedenza. È la vita.
toolbear,

29

Ho appena riscontrato questo per i file di configurazione. Non voglio usare il formato XML (dettagliato, graficamente, brutto, difficile da leggere) o "ini" (nessuna gerarchia, nessuno standard reale, ecc.) O il formato "Proprietà" Java (come .ini).

JSON può fare tutto ciò che può fare, ma è molto meno dettagliato e più leggibile dall'uomo - e i parser sono facili e onnipresenti in molte lingue. È solo un albero di dati. Ma i commenti fuori banda sono spesso una necessità per documentare configurazioni "predefinite" e simili. Le configurazioni non devono mai essere "documenti completi", ma alberi di dati salvati che possono essere leggibili dall'uomo quando necessario.

Immagino che si possa usare "#": "comment", per JSON "valido".


4
Per i file di configurazione, suggerirei YAML, non JSON. È (quasi) un superset più potente di JSON, ma supporta anche costrutti più leggibili, inclusi i commenti.
Marnen Laibow-Koser,

1
quante lingue pensi che supporti YAML per impostazione predefinita rispetto a JSON?
mmm

@Hamidam Oltre una dozzina di lingue supportano yaml: yaml.org - ma hai ragione a chiedere quanti hanno il supporto integrato, senza la necessità di una dipendenza da libreria di terze parti. Sembra Ruby 1.9.2. Qualcuno sa degli altri? E quali lingue forniscono il supporto per json per impostazione predefinita?
nealmcb,

5
L'interoperabilità di YAML è una bugia: stackoverflow.com/questions/450399/… . Se il tuo istinto è usare JSON per i file di configurazione, seguilo.
toolbear,

Questo è vecchio, ma credo che usare # non sia una buona idea. Json è vicino alla sintassi di una lettera Javascript. Javascript supporta 2 tipi di commenti: // e / * ... * / Se fossi in te rimarrei con uno o entrambi questi tipi di commenti.
Pascal Ganaye,

28

JSON non supporta i commenti in modo nativo, ma puoi creare il tuo decodificatore o almeno un preprocessore per eliminare i commenti, va benissimo (basta che ignori i commenti e non li usi per guidare come la tua applicazione dovrebbe elaborare i dati JSON ).

JSON non ha commenti. Un codificatore JSON NON DEVE generare commenti. Un decodificatore JSON PUO 'accettare e ignorare i commenti.

I commenti non devono mai essere usati per trasmettere qualcosa di significativo. Ecco a cosa serve JSON.

Cf: Douglas Crockford, autore delle specifiche JSON .


4
Crockford in seguito ha continuato a scrivere: "Supponiamo che tu stia utilizzando JSON per conservare i file di configurazione, che desideri annotare. Vai avanti e inserisci tutti i commenti che ti piacciono. Quindi esegui il pipe attraverso JSMin prima di passarlo al tuo parser JSON." Vedi la risposta di @ kyle-simpson su JSON.minify per maggiori informazioni.
toolbear,


27

JSON ha molto senso per i file di configurazione e altri usi locali perché è onnipresente e perché è molto più semplice di XML.

Se le persone hanno validi motivi per non avere commenti in JSON durante la comunicazione dei dati (validi o meno), probabilmente JSON potrebbe essere diviso in due:

  • JSON-COM: JSON sul cavo o regole applicabili quando si comunicano dati JSON.
  • JSON-DOC: documento JSON o JSON in file o localmente. Regole che definiscono un documento JSON valido.

JSON-DOC consentirà commenti e potrebbero esistere altre differenze minori come la gestione degli spazi bianchi. I parser possono facilmente convertire da una specifica all'altra.

Per quanto riguarda l' osservazione fatta da Douglas Crockford su questi temi (a cui fa riferimento @Artur Czajka)

Supponiamo che tu stia utilizzando JSON per conservare i file di configurazione, che desideri annotare. Vai avanti e inserisci tutti i commenti che ti piacciono. Quindi reindirizzalo attraverso JSMin prima di passarlo al tuo parser JSON.

Stiamo parlando di un problema di file di configurazione generico (cross-language / platform) e sta rispondendo con un'utilità specifica di JS!

Sicuramente un minify specifico per JSON può essere implementato in qualsiasi lingua, ma standardizzalo in modo che diventi onnipresente tra parser in tutte le lingue e piattaforme in modo che le persone smettano di perdere tempo senza la funzione perché hanno buoni casi d'uso per esso, cercando il problema in forum online e convincere le persone a dire loro che è una cattiva idea o che suggerisce che è facile implementare i commenti eliminando i file di testo.

L'altro problema è l'interoperabilità. Supponiamo di avere una libreria o API o qualsiasi tipo di sottosistema a cui siano associati alcuni file di configurazione o di dati. E questo sottosistema è accessibile da diverse lingue. Poi vai a dire alle persone: a proposito, non dimenticare di eliminare i commenti dai file JSON prima di passarli al parser!


Non è necessario frammentare JSON. JSON con commenti non è più JSON. Ma è perfettamente accettabile annotare il tuo JSON con commenti, purché tu ti assicuri di eliminarli prima di analizzarli o trasmetterli. Non dovrebbe mai essere responsabilità del destinatario farlo.
toolbear,

json5.org È una soluzione per json-doc
Michael Freidgeim il

24

Se si utilizza JSON5 è possibile includere commenti.


JSON5 è un'estensione proposta a JSON che mira a rendere più semplice la scrittura e la manutenzione da parte degli esseri umani. Lo fa aggiungendo alcune funzionalità minime di sintassi direttamente da ECMAScript 5.


5
Potresti per favore aggiungere un esempio? Quindi potresti effettivamente aver bisogno di quei personaggi extra.
dgilperez,

6
È richiesto dalle linee guida SO per fornire una risposta effettiva. Le risposte solo link non sono desiderate. È possibile controllare le linee guida stackoverflow.com/help/how-to-answer
dgilperez

2
SO è moderato dai suoi utenti. Ciò significa che posso fornire una risposta se la ho nello stesso modo in cui posso commentare la tua se non segue le linee guida. Ecco come SO diventa una grande risorsa.
dgilperez,

22

Il toolkit JavaScript Dojo Toolkit (almeno dalla versione 1.4), consente di includere commenti nel proprio JSON. I commenti possono essere di /* */formato. Dojo Toolkit utilizza JSON tramite la dojo.xhrGet()chiamata.

Altri toolkit JavaScript potrebbero funzionare in modo simile.

Questo può essere utile quando si sperimenta strutture dati alternative (o persino elenchi di dati) prima di scegliere un'opzione finale.


4
No. Non questo. JSON non ha commenti. Se si sceglie di annotare il proprio JSON con commenti, minimizzarlo prima di analizzare o trasmettere. Questa non dovrebbe essere la responsabilità del destinatario.
toolbear,

2
Non ho detto che JSON abbia commenti. Né intendevo implicare che fosse appropriato includerli nel tuo JSON, specialmente in un sistema di produzione. Ho detto che il toolkit Dojo ti consente di aggiungerli, il che è (o almeno era) effettivamente vero. Ci sono casi d'uso molto utili là fuori per farlo nella fase di test.
David,

1
È cattivo voodoo pubblicare commenti, e quindi non validi JSON, che dojo.xhrGet()incoraggia implicitamente accettando.
toolbear,

Continuo a votare per l'aggiornamento delle specifiche JSON per consentire i commenti. Sono tutto per minimizzare e rimuovere i commenti prima di trasmettere il JSON, ma non avere alcuna capacità di commentare il tuo JSON in modo standard senza doverlo passare attraverso un'utilità separata prima di analizzarlo sembra sciocco. Inoltre, è impossibile utilizzare un editor JSON nei file di configurazione JSON, poiché i file non sono JSON validi.
Craig,

20

JSON non è un protocollo con frame . È un formato senza lingua . Quindi il formato di un commento non è definito per JSON.

Come molte persone hanno suggerito, ci sono alcuni trucchi, ad esempio chiavi duplicate o una chiave specifica _commentche è possibile utilizzare. Tocca a voi.


18

È possibile avere commenti in JSONP , ma non in puro JSON. Ho appena trascorso un'ora a provare a far funzionare il mio programma con questo esempio tratto da Highcharts: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

Se segui il link, vedrai

?(/* AAPL historical OHLC data from the Google Finance API */
[
/* May 2006 */
[1147651200000,67.79],
[1147737600000,64.98],
...
[1368057600000,456.77],
[1368144000000,452.97]
]);

Dato che avevo un file simile nella mia cartella locale, non ci sono stati problemi con la politica della stessa origine , quindi ho deciso di utilizzare JSON puro ... e, naturalmente, $.getJSONnon riuscivo silenziosamente a causa dei commenti.

Alla fine ho appena inviato una richiesta HTTP manuale all'indirizzo sopra e mi sono reso conto che il tipo di contenuto era text/javascriptpoiché, beh, JSONP restituiva JavaScript puro. In questo caso sono ammessi commenti . Ma la mia applicazione ha restituito un tipo di contenuto application/json, quindi ho dovuto rimuovere i commenti.


17

Questa è una domanda "puoi" . Ed ecco una risposta "si" .

No, non dovresti usare membri di oggetti duplicati per inserire i dati del canale laterale in una codifica JSON. (Vedi "I nomi all'interno di un oggetto DOVREBBERO essere univoci" nell'RFC ).

E sì, è possibile inserire commenti intorno a JSON , che è possibile analizzare.

Ma se vuoi un modo per inserire ed estrarre dati arbitrari sul canale laterale su un JSON valido, ecco una risposta. Sfruttiamo la rappresentazione non univoca dei dati in una codifica JSON. Questo è consentito * nella sezione due della RFC sotto "Gli spazi bianchi sono consentiti prima o dopo uno dei sei caratteri strutturali".

* L'RFC afferma solo "gli spazi bianchi sono consentiti prima o dopo uno dei sei caratteri strutturali", senza menzionare esplicitamente stringhe, numeri, "false", "true" e "null". Questa omissione viene ignorata in TUTTE le implementazioni.


Innanzitutto, canonicalizza il tuo JSON minimizzandolo:

$jsonMin = json_encode(json_decode($json));

Quindi codifica il tuo commento in binario:

$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);

Quindi metti il ​​tuo binario:

$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);

Ecco il tuo output:

$jsonWithComment = $steg . $jsonMin;

1
L'RFC afferma solo "gli spazi bianchi sono consentiti prima o dopo uno dei sei caratteri strutturali", senza menzionare esplicitamente stringhe, numeri, "false", "true", "null". Questa omissione viene ignorata in TUTTE le implementazioni.
William Entriken,

1
Per una maggiore densità di commenti, non potresti codificare il tuo commento in ternario e utilizzare lo spazio, la scheda e la nuova riga per riporlo?
Claire Nielsen,

DOVREBBE non DEVE. Vedere la RFC 2119 esplicitamente inclusa: DEVE: questa parola, o i termini "RICHIESTO" o "SHALL", indicano che la definizione è un requisito assoluto della specifica. ... DOVREBBE: questa parola, o l'aggettivo "CONSIGLIATO", significa che possono esistere ragioni valide in circostanze particolari per ignorare un particolare elemento, ma le implicazioni complete devono essere comprese e ponderate attentamente prima di scegliere un corso diverso.
Jeff K,

Buona referenza Un ragionamento migliore contro l'uso di chiavi duplicate è la citazione dello standard "Quando i nomi all'interno di un oggetto non sono univoci, il comportamento del software che riceve tale oggetto è imprevedibile". Inoltre ora capisco perché lo standard non era "DEVE essere unico", questo semplifica un validatore, deve solo tracciare [e {, non ha bisogno di sapere quali chiavi sono già state usate.
William Entriken,

16

DISCLAIMER: QUESTO È SILLY

Esiste effettivamente un modo per aggiungere commenti e rimanere all'interno delle specifiche (non è necessario alcun parser aggiuntivo). Non si tradurrà in commenti leggibili dall'uomo senza alcun tipo di analisi.

Potresti abusare di quanto segue:

Gli spazi bianchi insignificanti sono consentiti prima o dopo qualsiasi token. Lo spazio bianco è una sequenza di uno o più dei seguenti punti di codice: tabulazione dei caratteri (U + 0009), avanzamento riga (U + 000A), ritorno a capo (U + 000D) e spazio (U + 0020).

In un modo confuso, puoi abusare di questo per aggiungere un commento. Ad esempio: inizia e termina il tuo commento con una scheda. Codifica il commento in base3 e usa gli altri spazi bianchi per rappresentarli. Per esempio.

010212 010202 011000 011000 011010 001012 010122 010121 011021 010202 001012 011022 010212 011020 010202 010202

( hello base threein ASCII) Ma invece di 0 usa lo spazio, per 1 usa l'avanzamento di riga e per 2 usa il ritorno a capo.

Questo ti lascerà con molto spazio bianco illeggibile (a meno che tu non abbia creato un plug-in IDE per codificarlo / decodificarlo al volo).

Non l'ho mai provato, per ovvi motivi e nemmeno tu.


12

Stiamo usando strip-json-commentsper il nostro progetto. Supporta qualcosa di simile:

/*
 * Description 
*/
{
    // rainbows
    "unicorn": /* ❤ */ "cake"
}

Basta npm install --save strip-json-commentsinstallarlo e usarlo come:

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}

Si noti che jsonnon è più un JSON valido quando include questi commenti di proprietà.
Roy Prins,

12

Nel mio caso, ho bisogno di usare i commenti per scopi di debug, prima dell'output della struttura JSON. Quindi ho deciso di utilizzare le informazioni di debug nell'intestazione HTTP, per evitare di interrompere il client:

header("My-Json-Comment: Yes, I know it's a workaround ;-) ");

Inserisci qui la descrizione dell'immagine


12

JSON non consente commenti di per sé. Il ragionamento è assolutamente folle, perché è possibile utilizzare JSON stesso per creare commenti, il che elimina completamente il ragionamento e carica lo spazio dati del parser senza una buona ragione per esattamente lo stesso risultato e potenziali problemi, come ad esempio: un JSON file con commenti.

Se si tenta di inserire commenti (usando //o /* */o #per esempio), alcuni parser falliranno perché ciò non rientra strettamente nelle specifiche JSON. Quindi non dovresti mai farlo.

Ecco un esempio, in cui il mio sistema di manipolazione delle immagini ha salvato le notazioni delle immagini e alcune informazioni di base (commenti) relative ad esse (in basso):

{
    "Notations": [
        {
            "anchorX": 333,
            "anchorY": 265,
            "areaMode": "Ellipse",
            "extentX": 356,
            "extentY": 294,
            "opacity": 0.5,
            "text": "Elliptical area on top",
            "textX": 333,
            "textY": 265,
            "title": "Notation 1"
        },
        {
            "anchorX": 87,
            "anchorY": 385,
            "areaMode": "Rectangle",
            "extentX": 109,
            "extentY": 412,
            "opacity": 0.5,
            "text": "Rect area\non bottom",
            "textX": 98,
            "textY": 385,
            "title": "Notation 2"
        },
        {
            "anchorX": 69,
            "anchorY": 104,
            "areaMode": "Polygon",
            "extentX": 102,
            "extentY": 136,
            "opacity": 0.5,
            "pointList": [
                {
                    "i": 0,
                    "x": 83,
                    "y": 104
                },
                {
                    "i": 1,
                    "x": 69,
                    "y": 136
                },
                {
                    "i": 2,
                    "x": 102,
                    "y": 132
                },
                {
                    "i": 3,
                    "x": 83,
                    "y": 104
                }
            ],
            "text": "Simple polygon",
            "textX": 85,
            "textY": 104,
            "title": "Notation 3"
        }
    ],
    "imageXW": 512,
    "imageYW": 512,
    "imageName": "lena_std.ato",
    "tinyDocs": {
        "c01": "JSON image notation data:",
        "c02": "-------------------------",
        "c03": "",
        "c04": "This data contains image notations and related area",
        "c05": "selection information that provides a means for an",
        "c06": "image gallery to display notations with elliptical,",
        "c07": "rectangular, polygonal or freehand area indications",
        "c08": "over an image displayed to a gallery visitor.",
        "c09": "",
        "c10": "X and Y positions are all in image space. The image",
        "c11": "resolution is given as imageXW and imageYW, which",
        "c12": "you use to scale the notation areas to their proper",
        "c13": "locations and sizes for your display of the image,",
        "c14": "regardless of scale.",
        "c15": "",
        "c16": "For Ellipses, anchor is the  center of the ellipse,",
        "c17": "and the extents are the X and Y radii respectively.",
        "c18": "",
        "c19": "For Rectangles, the anchor is the top left and the",
        "c20": "extents are the bottom right.",
        "c21": "",
        "c22": "For Freehand and Polygon area modes, the pointList",
        "c23": "contains a series of numbered XY points. If the area",
        "c24": "is closed, the last point will be the same as the",
        "c25": "first, so all you have to be concerned with is drawing",
        "c26": "lines between the points in the list. Anchor and extent",
        "c27": "are set to the top left and bottom right of the indicated",
        "c28": "region, and can be used as a simplistic rectangular",
        "c29": "detect for the mouse hover position over these types",
        "c30": "of areas.",
        "c31": "",
        "c32": "The textx and texty positions provide basic positioning",
        "c33": "information to help you locate the text information",
        "c34": "in a reasonable location associated with the area",
        "c35": "indication.",
        "c36": "",
        "c37": "Opacity is a value between 0 and 1, where .5 represents",
        "c38": "a 50% opaque backdrop and 1.0 represents a fully opaque",
        "c39": "backdrop. Recommendation is that regions be drawn",
        "c40": "only if the user hovers the pointer over the image,",
        "c41": "and that the text associated with the regions be drawn",
        "c42": "only if the user hovers the pointer over the indicated",
        "c43": "region."
    }
}

Il link "ragionamento" è interrotto. Qualche possibilità di trovare un link corrente ad esso?
Don Hatch,

Don, sfortunatamente, Google ha ucciso il sistema di social media che conteneva il post; Non ho idea di dove sia andato da lì il poster originale, se mai. Ucciderò il link nelle informazioni sopra, tuttavia, in modo da rimuovere l'ambiguità. Grazie.
fyngyrz,

Il ragionamento non è sciocco e l'hai appena dimostrato. L'implementazione dei commenti come tag preserva l' interoperabilità . Questo è esattamente il motivo per cui Crockford voleva che i commenti fossero analizzati come tag. Ora tutto è solo un tag e analizzato allo stesso modo .
Dominic Cerisano,

Se la specifica affermasse che "una riga che inizia con # è un commento", sarebbe completamente interoperabile. Allo stato attuale, i commenti caricano entrambi lo spazio del parser, in quanto sono elementi analizzati validi anziché essere considerati commenti e possono essere diversi per ogni file .json esistente. Mentre se (per esempio) la specifica dicesse "le righe che iniziano con # sono commenti", i parser potrebbero saltare quelle righe senza analizzare (più velocemente) e non caricare lo spazio del parser (migliore utilizzo della memoria). di commenti in .json, solo aspetti negativi.
fyngyrz,

11

Per tagliare un elemento JSON in parti aggiungo le righe "commento fittizio":

{

"#############################" : "Part1",

"data1"             : "value1",
"data2"             : "value2",

"#############################" : "Part2",

"data4"             : "value3",
"data3"             : "value4"

}

15
Hai emulato una struttura di file INI in JSON. Per favore, metti giù il tuo martello d'oro.
Artur Czajka,

4
RFC dice "I nomi all'interno di un oggetto DOVREBBERO essere univoci". Vedi anche questa persona che sta riscontrando un errore durante l'analisi di JSON come sopra: stackoverflow.com/questions/4912386/…
William Entriken,

Se si utilizza uno schema per convalidare JSON, potrebbe non riuscire a causa dei campi aggiuntivi.
Gregregdennis,

1
Se sei davvero determinato ad aggiungere commenti al tuo JSON, sarebbe molto più sensato fare qualcosa del genere: { "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." } questo mantiene il nome univoco e ti consente di aggiungere qualunque valore di stringa ti piaccia. È ancora un problema, perché i commenti non dovrebbero far parte del tuo JSON. Come altra alternativa, perché non aggiungere commenti prima o dopo il tuo JSON, ma non al suo interno?
Jazimov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.