Kann ich Kommentare innerhalb einer JSON-Datei verwenden? Wenn ja, wie?
Antworten
Zu viele Anzeigen?Dies ist eine "Können Sie" Frage. Und hier ist eine "Ja" Antwort.
Nein, Sie sollten keine duplizierten Objektmitglieder verwenden, um Seitenkanaldaten in eine JSON-Kodierung zu stopfen. (Siehe "Die Namen innerhalb eines Objekts SOLLTEN eindeutig sein". im RFC ).
Und ja, Sie könnten Kommentare einfügen um das JSON die Sie auswerten können.
Wenn Sie jedoch eine Möglichkeit suchen, beliebige Seitenkanaldaten in ein gültiges JSON einzufügen und zu extrahieren, haben wir hier eine Lösung. Wir machen uns die nicht eindeutige Darstellung von Daten in einer JSON-Kodierung zunutze. Dies ist erlaubt * in Abschnitt zwei des RFC unter "Whitespace is allowed before or after any of the six structural characters".
* Der RFC besagt nur, dass "Leerzeichen vor oder nach jedem der sechs strukturellen Zeichen zulässig sind", ohne ausdrücklich Zeichenfolgen, Zahlen, "falsch", "wahr" und "null" zu erwähnen. Diese Auslassung wird in ALLEN Implementierungen ignoriert.
Kanonisieren Sie zunächst Ihr JSON, indem Sie es minifizieren:
$jsonMin = json_encode(json_decode($json));
Kodieren Sie dann Ihren Kommentar in binärer Form:
$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);
Dann steuern Sie Ihr Binärsystem:
$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);
Hier ist Ihre Ausgabe:
$jsonWithComment = $steg . $jsonMin;
JSON erlaubt per se keine Kommentare. Die Argumentation ist völlig töricht, denn Sie können JSON verwenden selbst um Kommentare zu erstellen, was die Argumentation völlig überflüssig macht, et lädt den Datenraum des Parsers ohne triftigen Grund für genau das gleiche Ergebnis und die gleichen potenziellen Probleme, wie sie sind: eine JSON-Datei mit Kommentaren.
Wenn Sie versuchen, Kommentare einzufügen (mit
//
ou/* */
ou#
zum Beispiel), dann werden einige Parser fehlschlagen, weil dies streng genommen nicht der JSON-Spezifikation entspricht. Sie sollten also niemals das tun.
Hier zum Beispiel, wo mein Bildbearbeitungssystem hat gespeicherte Bildnotationen und einige grundlegende formatierte (Kommentar-)Informationen zu ihnen (am unteren Rand):
{
"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."
}
}
JSON ist kein gerahmtes Protokoll . Es ist eine Sprache freies Format . Das Format eines Kommentars ist also nicht für JSON definiert.
Wie viele Leute vorgeschlagen haben, gibt es einige Tricks, z. B. doppelte Schlüssel oder einen bestimmten Schlüssel _comment
die Sie verwenden können. Es liegt an Ihnen.
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
zu installieren und zu verwenden:
var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}