it-swarm.com.de

Können Kommentare in JSON verwendet werden?

Kann ich Kommentare in einer JSON-Datei verwenden? Wenn das so ist, wie?

6269

Nein. 

Das JSON sollte aus Daten bestehen. Wenn Sie einen Kommentar hinzufügen, handelt es sich auch um Daten.

Sie könnten ein bestimmtes Datenelement namens "_comment" (oder etwas anderes) haben, das von Apps, die JSON-Daten verwenden, ignoriert wird.

Es wäre wahrscheinlich besser, den Kommentar in den Prozessen zu haben, die die JSON generieren/empfangen, da sie wissen sollen, was die JSON-Daten im Voraus sind oder zumindest in ihrer Struktur. 

Aber wenn Sie beschlossen haben:

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

Nein, Kommentare der Form //… oder /*…*/ sind in JSON nicht zulässig. Diese Antwort basiert auf:

  • http://www.json.org
  • RFC 4627 : Der application/json-Medientyp für JavaScript-Objektnotation (JSON)
  • RFC 7159 Das JSON-Datenaustauschformat (JavaScript Object Notation) - Veraltet: 4627, 7158
1640
stakx

Fügen Sie bei Bedarf Kommentare hinzu; streichen Sie sie vor dem Parsen oder Übertragen mit einem Minifier aus.

Ich habe gerade JSON.minify () veröffentlicht, das Kommentare und Leerzeichen aus einem JSON-Block entfernt und ihn zu einem gültigen JSON macht, der geparst werden kann. Sie könnten es also wie folgt verwenden: 

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

Als ich es veröffentlichte, kam es zu einer großen Gegenreaktion von Leuten, die nicht einmal mit der Idee einverstanden waren. Daher entschied ich mich, einen umfassenden Blogbeitrag darüber zu schreiben, warum Kommentare in JSON sinnvoll sind . Es enthält diesen bemerkenswerten Kommentar des Erstellers von JSON:

Angenommen, Sie verwenden JSON, um Konfigurationsdateien aufzubewahren, die Sie mit Anmerkungen versehen möchten. Fahren Sie fort und fügen Sie alle gewünschten Kommentare ein. Leiten Sie es dann durch JSMin, bevor Sie es Ihrem JSON-Parser übergeben. - Douglas Crockford, 2012

Hoffentlich ist das hilfreich für diejenigen, die nicht der Meinung sind, warum JSON.minify () nützlich sein könnte.

720
Kyle Simpson

Kommentare wurden von JSON von Entwurf entfernt.

Ich habe Kommentare aus JSON entfernt, weil ich sah, dass die Leute sie verwendeten, um Direktive zu parsen, eine Praxis, die die Interoperabilität zerstört hätte. Ich weiß, dass der Mangel an Kommentaren manche Leute traurig macht, aber das sollte nicht. 

Angenommen, Sie verwenden JSON, um Konfigurationsdateien aufzubewahren, die Sie mit Anmerkungen versehen möchten. Fahren Sie fort und fügen Sie alle gewünschten Kommentare ein. Leiten Sie es dann durch JSMin, bevor Sie es Ihrem JSON-Parser übergeben.

Quelle: Öffentliche Erklärung von Douglas Crockford zu G +

393
Artur Czajka

HAFTUNGSAUSSCHLUSS: IHRE GARANTIE IS UNGÜLTIG

Wie bereits erwähnt, nutzt dieser Hack die Implementierung der Spezifikation. Nicht alle JSON-Parser werden diese Art von JSON verstehen. Insbesondere Streaming-Parser werden ersticken.

Es ist eine interessante Neugierde, aber Sie sollte es eigentlich gar nicht für irgendetwas verwendenUnten ist die ursprüngliche Antwort.


Ich habe einen kleinen Hack gefunden, der es Ihnen ermöglicht, Kommentare in eine JSON-Datei einzufügen, die sich nicht auf die Analyse auswirken oder die dargestellten Daten auf irgendeine Weise ändern.

Es scheint, dass Sie beim Deklarieren eines Objektliterales zwei Werte mit demselben Schlüssel angeben können, wobei der letzte Vorrang hat. Ob Sie es glauben oder nicht, es stellt sich heraus, dass JSON-Parser auf dieselbe Weise arbeiten. Daher können wir dies verwenden, um Kommentare in der Quell-JSON zu erstellen, die in einer geparsten Objektdarstellung nicht vorhanden sind. 

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

Wenn wir diese Technik anwenden, könnte Ihre kommentierte JSON-Datei folgendermaßen aussehen:

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

Der obige Code ist gültiger JSON . Wenn Sie es analysieren, erhalten Sie ein Objekt wie dieses:

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

Das heißt, es gibt keine Spur von Kommentaren und sie haben keine seltsamen Nebenwirkungen.

Viel Spaß beim Hacken!

198
Ped

JSON unterstützt keine Kommentare. Es war auch nie dazu gedacht, für Konfigurationsdateien verwendet zu werden, in denen Kommentare erforderlich wären.

Hjson ist ein Konfigurationsdateiformat für Menschen. Entspannte Syntax, weniger Fehler, mehr Kommentare.

 Hjson intro

Siehe hjson.org für JavaScript, Java, Python, PHP, Rust, Go, Ruby und C # -Bibliotheken.

140
laktak

Du kannst nicht Zumindest ist das meine Erfahrung aus einem kurzen Blick auf json.org .

JSON lässt seine Syntax auf dieser Seite anzeigen. Es gibt keine Anmerkung zu Kommentaren.

97
Cheery

Erwägen Sie die Verwendung von YAML. Es ist fast eine Obermenge von JSON (praktisch alles gültige JSON ist gültiges YAML) und erlaubt Kommentare.

95

Sie sollten stattdessen ein JSON-Schema schreiben. Das JSON-Schema ist derzeit eine vorgeschlagene Entwurfsspezifikation für das Internet. Neben der Dokumentation kann das Schema auch zur Validierung Ihrer JSON-Daten verwendet werden.

Beispiel:

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

Sie können Dokumentation bereitstellen, indem Sie das Schemaattribut description verwenden.

58
raffel

Wenn Sie Jackson als JSON-Parser verwenden, aktivieren Sie ihn, um Kommentare zuzulassen:

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

Dann können Sie Kommentare wie diese haben:

{
  key: "value" // Comment
}

Sie können auch Kommentare mit # beginnen, indem Sie Folgendes einstellen:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

Im Allgemeinen erlaubt die Spezifikation (wie bereits beantwortet) keine Kommentare.

56
Andrejs

Kommentare sind kein offizieller Standard. Einige Parser unterstützen zwar Kommentare im C-Stil. Eine, die ich verwende, ist JsonCpp . In den Beispielen gibt es folgendes:

// 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 bestätigt dies nicht. Kommentare sind also eine parserspezifische Erweiterung und kein Standard.

Ein weiterer Parser ist JSON5 .

Eine Alternative zu JSON TOML .

53
schoetbi

Folgendes habe ich in der Google Firebase-Dokumentation gefunden, in der Sie Kommentare in JSON einfügen können:

{
  "//": "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"
}
44
mana

Wir können keine Kommentare in JSON verwenden ... Siehe das Syntaxdiagramm für JSON unter JSON.org .

Douglas Crockford sagt " warum er Kommentare in JSON entfernt hat und eine alternative Möglichkeit bietet ":

Ich habe Kommentare aus JSON entfernt, weil ich sah, dass die Leute sie verwenden. parsing-Direktiven, eine Praxis, die zerstört hätte Interoperabilität. Ich weiß, dass das Fehlen von Kommentaren manche Leute ausmacht. traurig, aber es sollte nicht sein.

Angenommen, Sie verwenden JSON, um Konfigurationsdateien zu speichern, die Sie möchte kommentieren. Fügen Sie alle Kommentare ein, die Sie möchten . Leiten Sie es dann durch JSMin, bevor Sie es Ihrem JSON-Parser übergeben.

40
NavaRajan

Wenn Ihre Textdatei, bei der es sich um eine JSON-Zeichenfolge handelt, von einem Programm gelesen werden kann, wie schwierig wäre es, entweder C- oder C++ - Kommentare zu entfernen, bevor Sie sie verwenden?

Antwort: Es wäre ein Einzeiler. In diesem Fall können JSON-Dateien als Konfigurationsdateien verwendet werden.

37

Wenn Sie die Bibliothek Newtonsoft.Json mit ASP.NET zum Lesen/Deserialisieren verwenden, können Sie Kommentare im JSON-Inhalt verwenden:

// "name": "string"

// "id": int

oder

/* Das ist ein

kommentarbeispiel * /

PS: Einzeilige Kommentare werden nur von Newtonsoft Json ab Version 6 unterstützt.

Zusätzliche Anmerkung für Personen, die nicht direkt denken können: Ich verwende das JSON-Format für grundlegende Einstellungen in einer von mir vorgenommenen ASP.NET-Webanwendung. Ich lese die Datei, konvertiere sie mit der Newtonsoft-Bibliothek in das Einstellungsobjekt und verwende sie bei Bedarf.

Ich ziehe es vor, Kommentare zu jeder einzelnen Einstellung in der JSON-Datei selbst zu schreiben, und ich interessiere mich wirklich nicht für die Integrität des JSON-Formats, solange die von mir verwendete Bibliothek in Ordnung ist.

Ich denke, dies ist ein 'einfacher zu verwendender/verständlicher' Weg, als eine separate 'settings.README'-Datei zu erstellen und die darin enthaltenen Einstellungen zu erklären.

Wenn Sie ein Problem mit dieser Art der Verwendung haben; Entschuldigung, der Geist ist aus der Lampe. Die Leute würden andere Verwendungen für das JSON-Format finden, und es gibt nichts, was Sie dagegen tun können.

33
dvdmn

Die Idee hinter JSON ist der einfache Datenaustausch zwischen Anwendungen. Diese sind normalerweise webbasiert und die Sprache ist JavaScript.

Kommentare als solche sind eigentlich nicht erlaubt. Allerdings würde das Übergeben eines Kommentars als eines der Name/Wert-Paare in den Daten sicherlich funktionieren, obwohl diese Daten offensichtlich ignoriert werden müssen oder vom Parsing-Code speziell behandelt werden müssen.

Alles in allem ist es nicht beabsichtigt, dass die JSON-Datei Kommentare im traditionellen Sinne enthält. Es sollten nur die Daten sein.

Schauen Sie sich die JSON-Website an für mehr Details.

28
Neil Albrock

Ich stelle dies gerade für Konfigurationsdateien fest. Ich möchte nichtXML(verbose, grafisch, hässlich, schwer lesbar) oder "ini" -Format (keine Hierarchie, kein echter Standard usw.) oder Java "Properties" -Format (wie .ini).

JSON kann alles, was sie können, aber es ist viel weniger ausführlich und für den Menschen lesbarer - und Parser sind in vielen Sprachen einfach und allgegenwärtig. Es ist nur ein Datenbaum. Out-of-Band-Kommentare sind jedoch häufig notwendig, um "Standard" -Konfigurationen und dergleichen zu dokumentieren. Konfigurationen dürfen niemals "vollständige Dokumente" sein, sondern Bäume gespeicherter Daten, die bei Bedarf für Menschen lesbar sind.

Ich denke, man könnte "#": "comment" für "gültige" JSON verwenden.

27
peterk

JSON unterstützt keine nativen Kommentare. Sie können jedoch einen eigenen Decoder oder zumindest einen Präprozessor erstellen, um Kommentare auszusortieren. Das ist vollkommen in Ordnung (solange Sie nur Kommentare ignorieren und nicht verwenden, um zu bestimmen, wie Ihre Anwendung die JSON-Daten verarbeitet ).

JSON hat keine Kommentare. Ein JSON-Encoder MUSS NICHT Kommentare ausgeben . Ein JSON-Decoder KANN Kommentare akzeptieren und ignorieren.

Kommentare sollten niemals dazu verwendet werden, etwas Sinnvolles zu übermitteln. Das ist Was ist JSON?.

Cf: Douglas Crockford, Autor von JSON spec .

26
gaborous

Das hängt von Ihrer JSON-Bibliothek ab. Json.NET unterstützt Kommentare im JavaScript-Stil, /* commment */.

Siehe eine andere Stack Overflow-Frage .

26
AZ.

JSON ist für Konfigurationsdateien und andere lokale Anwendungen sehr sinnvoll, da es allgegenwärtig ist und viel einfacher als XML ist. 

Wenn Menschen starke Gründe gegen Kommentare in JSON haben, wenn Daten übermittelt werden (ob gültig oder nicht), könnte JSON möglicherweise in zwei Teile aufgeteilt werden:

  • JSON-COM: JSON auf der Leitung oder Regeln, die bei der Kommunikation von JSON-Daten gelten.
  • JSON-DOC: JSON-Dokument oder JSON in Dateien oder lokal. Regeln, die ein gültiges JSON-Dokument definieren.

JSON-DOC erlaubt Kommentare, und es können andere geringfügige Unterschiede vorhanden sein, z. B. die Verarbeitung von Whitespace. Parser können leicht von einer Spezifikation zur anderen konvertieren. 

In Bezug auf die Bemerkung von Douglas Crockford zu diesen Fragen (Bezug genommen von @Artur Czajka)

Angenommen, Sie verwenden JSON, um Konfigurationsdateien aufzubewahren, die Sie mit Anmerkungen versehen möchten. Fahren Sie fort und fügen Sie alle gewünschten Kommentare ein. Leiten Sie es dann durch JSMin, bevor Sie es Ihrem JSON-Parser übergeben.

Wir sprechen über ein generisches Problem mit Konfigurationsdateien (sprachenübergreifend/Plattform) und er antwortet mit einem JS-spezifischen Dienstprogramm!

Natürlich kann ein JSON-spezifisches Minify in jeder Sprache implementiert werden, .__ standardisieren Sie dies jedoch, so dass es in allen Sprachen und Plattformen allgegenwärtig ist, sodass die Benutzer keine Zeit mehr mit dem Feature verschwenden, weil sie gute Anwendungsfälle dafür haben Fragen Sie in Online-Foren nach, und bringen Sie die Leute dazu, ihnen mitzuteilen, dass dies eine schlechte Idee ist, oder schlagen Sie vor, dass es einfach ist, Kommentare aus Textdateien zu entfernen.

Das andere Problem ist die Interoperabilität. Angenommen, Sie haben eine Bibliothek oder API oder ein beliebiges Subsystem, dem einige Konfigurations- oder Datendateien zugeordnet sind. Und auf dieses Subsystem kann von verschiedenen Sprachen aus zugegriffen werden. Dann erzählst du den Leuten: übrigens Vergiss nicht, die Kommentare aus den JSON-Dateien herauszunehmen, bevor du sie an den Parser weiterleitest!

23
Basel Shishani

Wenn Sie JSON5 verwenden, können Sie Kommentare hinzufügen.


JSON5 ist eine vorgeschlagene Erweiterung von JSON, die es dem Menschen erleichtern soll, von Hand zu schreiben und zu warten. Dazu werden einige minimale Syntaxfunktionen direkt aus ECMAScript 5 hinzugefügt.

20
Smit Johnth

Mit dem JavaScript-Toolkit von Dojo Toolkit (mindestens ab Version 1.4) können Sie Kommentare in Ihre JSON einfügen. Die Kommentare können das /* */-Format haben. Dojo Toolkit verbraucht den JSON über den Aufruf dojo.xhrGet().

Andere JavaScript-Toolkits funktionieren möglicherweise ähnlich.

Dies kann hilfreich sein, wenn Sie mit alternativen Datenstrukturen (oder sogar Datenlisten) experimentieren, bevor Sie eine endgültige Option auswählen.

20
David

JSON ist kein gerahmtes Protokoll . Es ist ein sprachenfreies Format. Daher ist das Format eines Kommentars nicht für JSON definiert.

Wie viele Leute vorgeschlagen haben, gibt es einige Tricks, beispielsweise doppelte Schlüssel oder einen bestimmten Schlüssel _comment, den Sie verwenden können. Es liegt an dir.

17

Sie haben can Kommentare in JSONP , aber nicht in reinem JSON. Ich habe gerade eine Stunde damit verbracht, mein Programm mit diesem Beispiel von Highcharts zum Laufen zu bringen: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

Wenn Sie dem Link folgen, werden Sie sehen

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

Da ich eine ähnliche Datei in meinem lokalen Ordner hatte, gab es keine Probleme mit der Same-Origin-Richtlinie . Daher entschied ich mich für die Verwendung von reinem JSON ... und natürlich $.getJSON scheiterte an den Kommentaren.

Irgendwann habe ich nur eine manuelle HTTP-Anfrage an die obige Adresse gesendet und festgestellt, dass der Inhaltstyp text/javascript war, da JSONP reines JavaScript zurückgibt. In diesem Fall sind Kommentare sind erlaubt. Aber meine Anwendung hat den Inhaltstyp application/json zurückgegeben, daher musste ich die Kommentare entfernen.

17
osa

Dies ist eine "can you" - Frage. Und hier ist eine Antwort "yes".

Nein, Sie sollten keine doppelten Objektelemente verwenden, um Seitenkanaldaten in eine JSON-Codierung zu füllen. (Siehe "Die Namen innerhalb eines Objekts SOLLTEN eindeutig sein" in der RFC ).

Und ja, Sie könnten Kommentare einfügen um die JSON , die Sie auswerten könnten.

Wenn Sie jedoch eine Möglichkeit wünschen, beliebige Seitenkanaldaten in eine gültige JSON einzufügen und daraus zu extrahieren, finden Sie hier eine Antwort. Wir nutzen die nicht eindeutige Darstellung von Daten in einer JSON-Codierung. Das ist erlaubt* In Abschnitt 2 des RFC unter "Leerzeichen ist vor oder nach einem der sechs strukturellen Zeichen zulässig".

*Der RFC gibt nur an, dass "Leerzeichen vor oder nach einem der sechs Strukturzeichen zulässig ist", wobei Strings, Zahlen, "false", "true" und "null" nicht explizit erwähnt werden. Diese Auslassung wird in ALLEN Implementierungen ignoriert.


Kanonisieren Sie zunächst Ihr JSON, indem Sie es minimieren:

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

Dann kodiere deinen Kommentar in binär:

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

Dann steg deine Binärdatei:

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

Hier ist Ihre Ausgabe:

$jsonWithComment = $steg . $jsonMin;
16

HAFTUNGSAUSSCHLUSS: DIESES IS DUMM

Es gibt tatsächlich eine Möglichkeit, Kommentare hinzuzufügen und innerhalb der Spezifikation zu bleiben (kein zusätzlicher Parser erforderlich). Es wird jedoch nicht zu für Menschen lesbaren Kommentaren ohne irgendeine Art von Analyse führen.

Sie könnten Folgendes missbrauchen:

Unbedeutendes Leerzeichen ist vor oder nach einem Token zulässig. Leerzeichen ist eine beliebige Folge von einem oder mehreren der folgenden Codepunkte: Zeichentabelle (U + 0009), Zeilenvorschub (U + 000A), Wagenrücklauf (U + 000D) und Leerzeichen (U + 0020).

Auf eine abgedroschene Weise können Sie dies missbrauchen, um einen Kommentar hinzuzufügen. Zum Beispiel: Beginnen und beenden Sie Ihren Kommentar mit einem Tabulator. Codieren Sie den Kommentar in base3 und verwenden Sie die anderen Leerzeichen, um sie darzustellen. Zum Beispiel.

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

(hello base three in ASCII) Verwenden Sie jedoch anstelle von 0 Leerzeichen den Zeilenvorschub für 1 und den Wagenrücklauf für 2.

Dies hinterlässt nur eine Menge unlesbarer Leerzeichen (es sei denn, Sie erstellen ein IDE -Plugin, um es im laufenden Betrieb zu codieren/decodieren).

Ich habe es aus offensichtlichen Gründen noch nie versucht und du auch nicht.

11
Roy Prins

Wir verwenden strip-json-comments für unser Projekt. Es unterstützt so etwas wie:

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

Einfach npm install --save strip-json-comments für die Installation und Verwendung wie folgt:

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

Es gibt eine gute Lösung (Hack), die gültige JSON ist. Machen Sie einfach den gleichen Schlüssel zweimal (oder mehr). Zum Beispiel: 

{
  "param" : "This is the comment place",
  "param" : "This is value place",
}

Also wird JSON das so verstehen:

{
  "param" : "This is value place",
}
10
Aurimas

Um ein JSON-Element in Teile zu schneiden, füge ich "Dummy-Kommentar" -Zeilen hinzu:

{

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

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

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

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

}
10
Chris

JSON unterstützte Kommentare, wurde jedoch missbraucht und aus dem Standard entfernt.

Vom Schöpfer von JSON:

Ich habe Kommentare aus JSON entfernt, weil ich sah, dass die Leute sie verwendeten, um Direktive zu parsen, eine Praxis, die die Interoperabilität zerstört hätte. Ich weiß, dass der Mangel an Kommentaren manche Leute traurig macht, aber das sollte nicht. - Douglas Crockford, 2012

Die offizielle JSON-Site befindet sich unter JSON.org . JSON wird von ECMA International als Standard definiert. Es gibt immer ein Petitionsverfahren, um die Standards zu überarbeiten. Es ist unwahrscheinlich, dass dem JSON-Standard aus verschiedenen Gründen Anmerkungen hinzugefügt werden.

JSON von Design ist eine einfach zu implementierende (vom Menschen analysierte) Alternative zu XML. Es wird sogar so weit vereinfacht, dass Anmerkungen nicht erforderlich sind. Es ist nicht einmal eine Auszeichnungssprache. Das Ziel ist Stabilität und Interoperabilität.

Jeder, der die Beziehung von "has-a" zur Objektorientierung kennt, kann jede JSON-Struktur verstehen - das ist der springende Punkt. Es ist nur ein gerichteter azyklischer Graph (DAG) mit Knoten-Tags (Schlüssel/Wert-Paare), der eine nahezu universelle Datenstruktur darstellt.

Diese einzige Anmerkung ist möglicherweise "// Dies sind DAG-Tags". Die Schlüsselnamen können so informativ sein wie erforderlich.

Jede Plattform kann JSON mit nur wenigen Codezeilen analysieren. XML erfordert komplexe OO - Bibliotheken, die auf vielen Plattformen nicht funktionsfähig sind.

Anmerkungen würden JSON einfach weniger interoperabel machen. Es gibt einfach nichts anderes hinzuzufügen, es sei denn, Sie benötigen wirklich eine Markup Language (XML) und kümmern sich nicht darum, ob Ihre persistenten Daten leicht analysiert werden können.

9

Der Autor von JSON möchte, dass wir Kommentare in die JSON aufnehmen, diese jedoch entfernen, bevor sie analysiert werden (siehe link von Michael Burr). Wenn JSON Kommentare haben sollte, warum sollten Sie sie nicht standardisieren und den JSON-Parser die Arbeit erledigen lassen? Ich stimme der Logik dort nicht zu, aber das ist leider der Standard. Die Verwendung einer YAML-Lösung, wie von anderen vorgeschlagen, ist gut, erfordert jedoch eine Bibliotheksabhängigkeit.

Wenn Sie Kommentare entfernen möchten, aber keine Bibliotheksabhängigkeit haben möchten, finden Sie hier eine zweizeilige Lösung, die für Kommentare im C++ - Stil geeignet ist, aber an andere angepasst werden kann:

var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

Beachten Sie, dass diese Lösung nur in Fällen verwendet werden kann, in denen Sie sicher sein können, dass die JSON-Daten keinen Kommentarinitiator enthalten, z. ('//').

Eine weitere Möglichkeit, JSON-Analyse, das Entfernen von Kommentaren und keine zusätzliche Bibliothek zu erreichen, besteht darin, die JSON in einem JavaScript-Interpreter auszuwerten. Der Nachteil bei diesem Ansatz ist natürlich, dass Sie nur unbeschädigte Daten auswerten möchten (keine nicht vertrauenswürdige Benutzereingabe). Hier ist ein Beispiel für diesen Ansatz in Node.js - ein weiterer Vorbehalt. Das folgende Beispiel liest die Daten nur einmal und wird dann zwischengespeichert:

data = require(fs.realpathSync(doctree_fp));
9

JSON erlaubt per se keine Kommentare. Die Argumentation ist absolut dumm, da Sie JSON selbst verwenden können, um Kommentare zu erstellen, die die Argumentation vollständig umgehen. und lädt den Parser-Datenraum ohne guten Grund überhaupt für genau das gleiche Ergebnis und mögliche Probleme, wie sie sind: eine JSON-Datei mit Kommentaren.

Wenn Sie versuchen, Kommentare einzufügen (mit // oder /* */ oder # zum Beispiel), dann schlagen einige Parser fehl, da dies strikt nicht innerhalb der JSON-Spezifikation liegt. Also solltest du niemals das tun.

Hier ist ein Beispiel, in dem mein Bildbearbeitungssystem Bildnotizen und einige grundlegende formatierte (Kommentar-) Informationen dazu gespeichert hat (unten):

{
    "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."
    }
}
8
fyngyrz

Seufzer. Warum nicht einfach Felder hinzufügen, z.

{
    "note1" : "This demonstrates the provision of annotations within a JSON file",
    "field1" : 12,
    "field2" : "some text",

    "note2" : "Add more annotations as necessary"
}

Stellen Sie nur sicher, dass Ihre "Notex" -Namen keinen Konflikt mit realen Feldern haben.

7
Steve Thomas

Sie können JSON mit Kommentaren verwenden, wenn Sie es als Textdatei laden und dann Kommentare daraus entfernen.

Sie können dafür die Bibliothek decomment verwenden. Unten ist ein vollständiges Beispiel.

Eingabe-JSON (Datei input.js):

/*
* multi-line comments
**/
{
    "value": 123 // one-line comment
}

Testanwendung:

var decomment = require('decomment');
var fs = require('fs');

fs.readFile('input.js', 'utf8', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        var text = decomment(data); // removing comments
        var json = JSON.parse(text); // parsing JSON
        console.log(json);
    }
});

Ausgabe:

{ value: 123 }

Siehe auch: gulp-decomment , grunt-decomment

7
vitaly-t

Ich habe gerade " grunt-strip-json-comments " gefunden.

“Kommentare von JSON entfernen. Damit können Sie Kommentare in Ihren JSON-Dateien verwenden! "

{
    // Rainbows
    "Unicorn": /* ❤ */ "cake"
}

Wenn Ihr Kontext Node.js-Konfiguration ist, können Sie JavaScript über module.exports als Alternative zu JSON betrachten:

module.exports = {
    "key": "value",

    // And with comments!
    "key2": "value2"
};

Die require-Syntax bleibt unverändert. Da es sich hierbei um JavaScript handelt, sollte die Dateierweiterung .js sein.

4
Nick

In meinem Fall benötige ich Kommentare zu Debug-Zwecken, bevor die JSON-Struktur ausgegeben wird. Also entschied ich mich, Debug-Informationen im HTTP-Header zu verwenden, um den Client nicht zu beschädigen:

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

 Enter image description here

4
WilliamK

Sie können die einfache Vorverarbeitung über reguläre Ausdrücke verwenden. Beispielsweise dekodiert die folgende Funktion kommentiertes JSON in PHP:

function json_decode_commented ($data, $objectsAsArrays = false, $maxDepth = 512, $opts) {
  $data = preg_replace('~
    (" (?:[^"\\\\] | \\\\\\\\ | \\\\")*+ ") | \# [^\v]*+ | // [^\v]*+ | /\* .*? \*/
  ~xs', '$1', $data);

  return json_decode($data, $objectsAsArrays, $maxDepth, $opts);
}

Es unterstützt alle Kommentare im PHP-Stil:/*, #, //. String-Literale bleiben erhalten.

3

Wenn Sie PHP verwenden, können Sie mit dieser Funktion nach ///* -Typkommentaren in der JSON-Zeichenfolge suchen und diese entfernen, bevor Sie sie in ein Objekt/Array analysieren:

function json_clean_decode($json, $assoc = true, $depth = 512, $options = 0) {
       // search and remove comments like /* */ and //
       $json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

       if(version_compare(phpversion(), '5.4.0', '>=')) {
           $json = json_decode($json, $assoc, $depth, $options);
       }
       elseif(version_compare(phpversion(), '5.3.0', '>=')) {
           $json = json_decode($json, $assoc, $depth);
       }
       else {
           $json = json_decode($json, $assoc);
       }

       return $json;
   }

Hoffe das hilft!

2
Meru-kun

Nein, json kann keine Kommentare direkt haben. Wie von this vorgeschlagen, können Sie jedoch einen ähnlichen Effekt erzielen, indem Sie wie folgt vorgehen

{
    "//name": "Name comment here",
    "name": "Jack",

    "//age": "Age comment here",
    "age": "25"
}

Die meisten JSON-Parser ignorieren Eigenschaften, die nicht zugeordnet sind.

2
datchung

Sicher können Sie JSON kommentieren. Um eine kommentierte JSON-Datei aus Javascript zu lesen, können Sie Kommentare entfernen, bevor Sie sie analysieren (siehe folgenden Code). Ich bin sicher, dass dieser Code verbessert werden kann, aber es ist für diejenigen, die Regexp verwenden, leicht zu verstehen.

Ich verwende kommentierte JSON-Dateien, um Neuronenformen für meine synthetischen Reflexsysteme festzulegen. Ich verwende auch kommentiertes JSON, um Zwischenzustände für ein laufendes Neuronensystem zu speichern. Es ist sehr praktisch, Kommentare zu haben. Hören Sie nicht auf Didakte, die Ihnen sagen, dass sie eine schlechte Idee sind.

fetch(filename).then(function(response) {
    return response.text();
}).then(function(commented) {
    return commented.
        replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '$1').
        replace(/\r/,"\n").
        replace(/\n[\n]+/,"\n");
}).then(function(clean) {
    return JSON.parse(clean);
}).then(function(json) {
    // Do what you want with the JSON object.
});
2
jlettvin

Wie viele Antworten bereits angedeutet haben, hat JSON keine nativen Kommentare. Natürlich willst du sie manchmal trotzdem. Für Python gibt es zwei Möglichkeiten, dies zu tun mit commentjson (# und // nur für Python 2) oder json_tricks (# oder // für Python 2 und Python 3) Eigenschaften. Haftungsausschluss: Ich habe json_tricks gemacht.

2
Mark

Die praktische Antwort für VSCode-Benutzer im Jahr 2019 ist die Verwendung der Erweiterung 'jsonc'.

Praktisch, da dies die von VSCode erkannte Erweiterung ist, um "JSON mit Kommentaren" anzuzeigen. Bitte lassen Sie mich in den Kommentaren unten über andere Editoren/IDEs Bescheid wissen.

Es wäre schön, wenn VSCode und andere Editoren auch native Unterstützung für 'json5' hinzufügen würden. Momentan enthält VSCode jedoch nur Unterstützung für 'jsonc'.

(Ich habe alle Antworten durchgesehen, bevor ich das gepostet habe, und erwähne nicht "jsonc".)

1
Tom

Ja, du kannst Kommentare haben. Ich werde jedoch den oben genannten Grund nicht empfehlen.

Ich habe einige Nachforschungen angestellt und festgestellt, dass alle für JSON erforderlichen Methoden die JSON.parse-Methode verwenden. Also kam ich zu einer Lösung: Wir können JSON.parse überschreiben oder Affen-Patches durchführen.

Hinweis: Nur auf Node.js getestet ;-)

var oldParse = JSON.parse;
JSON.parse = parse;
function parse(json){
    json = json.replace(/\/\*.+\*\//, function(comment){
        console.log("comment:", comment);
        return "";
    });
    return oldParse(json)
}

JSON-Datei:

{
  "test": 1
  /* Hello, babe */
}
1
xdeepakv

Ich bin in meinem aktuellen Projekt auf dieses Problem gestoßen, da ich ziemlich viel JSON habe, für das einige Kommentare erforderlich sind, damit die Dinge leicht zu merken sind.

Ich habe diese einfache Python-Funktion verwendet, um Kommentare zu ersetzen und json.loads zu verwenden, um sie in eine dict zu konvertieren:

import json, re

def parse_json(data_string):
  result = []
  for line in data_string.split("\n"):
    line = line.strip()
    if len(line) < 1 or line[0:2] == "//":
      continue
    if line[-1] not in "\,\"\'":
      line = re.sub("\/\/.*?$", "", line)
    result.append(line)
  return json.loads("\n".join(result))

print(parse_json("""
{
  // This is a comment
  "name": "value" // so is this
  // "name": "value"
  // the above line gets removed
}
"""))
1
LogicalBranch

Sie können JSON-LD und den schema.org-Kommentar verwenden, um Kommentare richtig zu schreiben: 

{
    "https://schema.org/comment": "this is a comment"
}
0
MovGP0

* .json-Dateien werden im Allgemeinen als Konfigurationsdateien oder statische Daten verwendet. Daher sind Kommentare erforderlich.

Das Problem besteht darin, den Inhalt eines Objekts zu analysieren. Die Lösung ist, immer eine Reinigungsfunktion (Server oder Client) anzuwenden.

PHP

 $rgx_arr = ["/\/\/[^\n]*/sim", "/\/\*.*?\*\//sim", "/[\n\r\t]/sim"];
 $valid_json_str = \preg_replace($rgx_arr, '', file_get_contents(path . '*.json'));

JavaScript

valid_json_str = json_str.replace(/\/\/[^\n]*/gim.'').replace(/\/\*.*?\*\//gim,'')
0
bortunac

Es gibt andere Bibliotheken, die JSON-kompatibel sind und Kommentare unterstützen.

Ein bemerkenswertes Beispiel ist die "Hashcorp Language" (HCL) " . Sie wird von den gleichen Leuten geschrieben, die Vagrant, Packer, Konsul und Tresor gemacht haben.

0
spuder

In diesem gesamten Thread wird davon ausgegangen, dass das Hinzufügen von Kommentaren die einzige Verbesserung ist, die an JSON vorgenommen werden muss. Wenn jemand keine Kommentare in JSON haben möchte, weil diese für die Serialisierung verwendet werden sollen, lassen Sie die Kommentare einfach weg. Gleiches gilt für Whitespace. Aber warum dort aufhören? Warum sind Anführungszeichen erforderlich in JSON? Sie fügen nichts Nützliches hinzu.

Der einzige Grund, warum ich mir vorstellen kann, dass JSON so starr ist, ist, dass das Parsen schwierig ist. Ist es aber nicht. Fast jeder Programmierer kann einen JSON-Parser in beide Richtungen schreiben.

Ich möchte, dass JSON lesbar und effizient (kurz) ist und sich für die Datenübertragung, Konfigurationsdateien und vieles mehr eignet. Beide Anforderungen werden durch das folgende Beispiel erfüllt:

{stringA: stringB, stringC: stringD, [stringE, stringF]}

Kürzer als jede andere JSON-Spezifikation, aber genauso lesbar und effizienter.

Müssen Sie Anführungszeichen, Apostrophe, Kommas oder Klammern in eine Eigenschaft oder einen Wert einfügen? Fügen Sie sie einfach in Fragezeichen oder Apostrophe (mit Backslash-Escape) ein, genau wie in JavaScript.

Aber bitte machen Sie Anführungszeichen optional. Warum? Da JSON keine Variablen- oder Funktionsnamen enthalten kann (um Injection-Angriffe zu vermeiden), bieten Anführungszeichen keine Disambiguierung. Wir wissen bereits, dass alle Daten Zeichenfolgen sind. Lassen Sie die Anführungszeichen also bitte bereits weg, es sei denn, sie werden wirklich benötigt.

0
David Spector