it-swarm-eu.dev

Mohou být v JSONu použity komentáře?

Mohu v souboru JSON použít komentáře? Pokud ano, jak?

6269
Michael Gundlach

Ne. 

JSON by měl být dat, a pokud vložíte komentář, pak to budou také data.

Mohli byste mít označený datový prvek nazvaný "_comment" (nebo něco), který by byl ignorován aplikacemi používajícími data JSON.

Pravděpodobně by bylo lepší mít komentář v procesech, které generují/přijímají JSON, protože mají vědět, co budou data JSONu předem, nebo alespoň strukturu. 

Ale pokud jste se rozhodli:

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

Ne, komentáře formuláře //… nebo /*…*/ nejsou v JSONu povoleny. Tato odpověď je založena na:

  • http://www.json.org
  • RFC 4627 : application/json Typ média pro zápis objektů JavaScript (JSON)
  • RFC 7159 Formát pro výměnu objektů JavaScript (JSON) - Obsoletes: 4627, 7158
1640
stakx

Pokud zvolíte, přidejte komentáře; před syntaktickou analýzou nebo přenosem je vyjměte s minifikátorem.

Právě jsem vydala JSON.minify (), která odstraňuje komentáře a mezery z bloku JSON a dělá z něj platný JSON, který lze analyzovat. Můžete ho použít jako: 

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

Když jsem to vydala, dostala jsem obrovskou odpor lidí, kteří nesouhlasili ani s myšlenkou na to, tak jsem se rozhodla, že bych napsala ucelený blog o tom, proč komentáře dávají smysl v JSON . Zahrnuje tento pozoruhodný komentář od autora JSON:

Předpokládejme, že používáte JSON k uchovávání konfiguračních souborů, které byste chtěli anotovat. Pokračujte a vložte všechny komentáře, které se vám líbí. Pak ho předejte JSMin před předáním analyzátoru JSON. - Douglas Crockford, 2012

Doufejme, že je to užitečné těm, kteří nesouhlasí s tím, proč by mohlo být užitečné použít JSON.minify ().

720
Kyle Simpson

Připomínky byly ze společnosti JSON odstraněny podle návrhu.

Z JSONu jsem odstranil komentáře, protože jsem viděl, že je lidé používají k tomu, aby drželi direktivy analýzy, což je praxe, která by zničila interoperabilitu. Vím, že nedostatek komentářů činí některé lidi smutnými, ale nemělo by to. 

Předpokládejme, že používáte JSON k uchovávání konfiguračních souborů, které byste chtěli anotovat. Pokračujte a vložte všechny komentáře, které se vám líbí. Pak ho předejte JSMin před předáním analyzátoru JSON.

Zdroj: Veřejné prohlášení Douglase Crockforda o G +

393
Artur Czajka

JSON nepodporuje komentáře. Nikdy nebylo zamýšleno, aby byl použit pro konfigurační soubory, kde by byly potřeba komentáře.

Hjson je formát konfiguračního souboru pro lidi. Uvolněná syntaxe, méně chyb, více komentářů.

 Hjson intro

Viz hjson.org pro JavaScript, Java, Python, PHP, Rust, Go, Ruby a C # knihovny.

140
laktak

Nemůžeš. Alespoň to je moje zkušenost z rychlého pohledu na json.org .

JSON má na této stránce vizualizovanou syntaxi. Není žádná poznámka o komentářích.

97
Cheery

Zvažte použití YAML. Je to skoro nadmnožina JSON (prakticky všechny platné JSON je platné YAML) a umožňuje komentáře.

95

Místo toho byste měli napsat schéma JSON . Schéma JSON je v současné době navrhovanou specifikací internetového návrhu. Kromě dokumentace může být schéma také použito pro ověření vašich dat JSON.

Příklad:

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

Dokumentaci můžete poskytnout pomocí atributu description.

58
raffel

Pokud používáte Jackson jako váš analyzátor JSON, pak je to způsob, jak mu povolit komentáře:

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

Pak můžete mít následující komentáře:

{
  key: "value" // Comment
}

Můžete také mít komentáře začínající na # nastavením:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

Obecně (jak bylo řečeno dříve) specifikace neumožňuje komentáře.

56
Andrejs

Komentáře nejsou oficiálním standardem. I když některé parsery podporují komentáře ve stylu C. Ten, který používám, je JsonCpp . V příkladech je tento:

// 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 toto neplatí. Takže komentáře jsou specifickým rozšířením syntaktického analyzátoru a nejsou standardní.

Další parser je JSON5 .

Alternativa k JSON TOML .

53
schoetbi

Zde je to, co jsem našel v dokumentaci Google Firebase která vám umožňuje vkládat komentáře do 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"
}
44
mana

Je nám líto, ale v JSON nemůžeme používat komentáře ... Viz diagram syntaxe pro JSON on JSON.org .

Douglas Crockford říká " proč odstranil komentáře v JSON a poskytl alternativní způsob, jak to udělat ":

Z JSONu jsem odstranil komentáře, protože jsem viděl, že je lidé používají k tomu, aby [….] Drželi direktivy, které by zničily interoperabilitu. Vím, že nedostatek komentářů způsobuje, že někteří lidé jsou smutní, ale neměli by.

Předpokládejme, že používáte JSON k uchovávání konfiguračních souborů, které byste chtěli komentovat . Jděte do toho a vložte všechny komentáře, které se vám líbí. Pak ho přes JSMin před předáním analyzátoru JSON.

40
NavaRajan

Pokud váš textový soubor, který je řetězec JSON, bude číst nějaký program, jak obtížné by bylo odstranit komentáře ve stylu C nebo C++ před použitím?

Odpověď: Byla by to jedna vložka. Pokud tak učiníte, soubory JSON lze použít jako konfigurační soubory.

37
John T. Vonachen

Pokud používáte knihovnu Newtonsoft.Json s technologií ASP.NET ke čtení/deserialize, můžete použít komentáře v obsahu JSON:

// "name": "řetězec"

// "id": int

nebo

/ * Toto je a

příklad komentáře * /

PS: / Single-line komentáře jsou podporovány pouze s 6 + verze Newtonsoft Json.

Dodatečná poznámka pro lidi, kteří si nemůžou myslet z krabice: Používám formát JSON pro základní nastavení v webové aplikaci ASP.NET, kterou jsem vytvořil. Přečetl jsem si soubor, převést jej do objektu nastavení pomocí knihovny Newtonsoft a použít jej v případě potřeby.

Dávám přednost psaní komentářů ke každému jednotlivému nastavení v samotném souboru JSON a opravdu se nestarám o integritu formátu JSON, pokud je s ním knihovna, kterou používám, v pořádku.

Myslím si, že je to způsob „snadnějšího použití/pochopení“ než vytvoření samostatného souboru „settings.README“ a vysvětlení nastavení v něm.

Pokud máte problém s tímto druhem použití; Je mi líto, džin je mimo lampu. Lidé by mohli najít další využití pro formát JSON a nic s tím nelze dělat.

33
dvdmn

JSON má za cíl poskytnout jednoduchou výměnu dat mezi aplikacemi. Jedná se obvykle o web a jazyk je JavaScript.

To opravdu neumožňuje komentáře jako takové, nicméně předávání komentáře jako jednoho z dvojic jméno/hodnota v datech by jistě fungovalo, i když tato data by zřejmě musela být ignorována nebo zpracována specificky pomocí kódu analýzy.

Vše, co bylo řečeno, není záměr, aby soubor JSON obsahoval komentáře v tradičním smyslu. Měla by to být jen data.

Pro více informací se podívejte na webovou stránku JSON .

28
Neil Albrock

Právě jsem se setkal s konfiguračními soubory. Nechci používatXML(verbose, graficky, ošklivě, těžko čitelné) nebo "ini" formát (žádná hierarchie, žádný skutečný standard, atd.) Nebo formát Java "Properties" (jako .ini).

JSON dokáže udělat vše, co je v jeho silách, ale je to méně podrobný a více čitelný člověk - a analyzátory jsou jednoduché a všudypřítomné v mnoha jazycích. Je to jen strom dat. Ale komentáře mimo pásmo jsou nutností často dokumentovat "výchozí" konfigurace a podobně. Konfigurace nejsou nikdy „úplné dokumenty“, ale stromy uložených dat, které mohou být v případě potřeby čitelné pro člověka.

Myslím, že by bylo možné použít "#": "comment", pro "platné" JSON.

27
peterk

JSON nepodporuje komentáře nativně, ale můžete si vytvořit svůj vlastní dekodér nebo alespoň preprocesor, který vám umožní odebrat komentáře, což je naprosto v pořádku (pokud ignorujete komentáře a nepoužíváte je k tomu, jak by aplikace měla zpracovávat data JSON) ).

JSON nemá žádné komentáře. Kodér JSON NESMÍ vydávat komentáře. Dekodér JSON MŮŽE přijmout a ignorovat komentáře.

Komentáře by nikdy neměly být používány k přenosu něčeho smysluplného. To je to, pro co je JSON.

Cf: Douglas Crockford, autor JSON spec .

26
gaborous

Záleží na vaší knihovně JSON. Json.NET podporuje komentáře ve stylu JavaScript, /* commment */.

Viz další otázka přetečení zásobníku .

26
AZ.

JSON má velký smysl pro konfigurační soubory a další lokální použití, protože je všudypřítomný a protože je mnohem jednodušší než XML. 

Pokud mají lidé silné důvody proti tomu, aby v JSONu při komunikaci s údaji (ať už platnou nebo ne) měli komentáře, mohl by být JSON rozdělen do dvou:

  • JSON-COM: JSON na vodiči, nebo pravidla, která platí při komunikaci dat JSON.
  • JSON-DOC: JSON dokument nebo JSON v souborech nebo lokálně. Pravidla, která definují platný dokument JSON.

JSON-DOC umožní komentáře a mohou existovat další drobné rozdíly, jako je například manipulace s mezerami. Parsers lze snadno převést z jednoho spec na druhý. 

S ohledem na poznámku vytvořil Douglas Crockford na toto téma (odkazoval @Artur Czajka)

Předpokládejme, že používáte JSON k uchovávání konfiguračních souborů, které byste chtěli anotovat. Pokračujte a vložte všechny komentáře, které se vám líbí. Pak ho předejte JSMin před předáním analyzátoru JSON.

Mluvíme o obecném problému s konfiguračním souborem (křížový jazyk/platforma) a on odpoví na specifický nástroj JS!

Jistě, že specifický minify JSON lze implementovat v jakémkoli jazyce, , Ale standardizovat to tak, že se stane všudypřítomným v analyzátorech ve všech jazycích a platformách, takže lidé přestanou plýtvat časem, který postrádá funkci, protože mají pro ně dobré případy použití, dívat se na problém v on-line fórech, a jak se lidé říkají, že je to špatný nápad, nebo naznačuje, že je snadné implementovat stripping komentáře z textových souborů.

Další otázkou je interoperabilita. Předpokládejme, že máte knihovnu nebo API nebo jakýkoli druh podsystému, ke kterému jsou přiřazeny některé konfigurační nebo datové soubory. Tento podsystém je přístupný z různých jazyků. Pak jdeš o vyprávění lidem: mimochodem Nezapomeňte si z JSON souborů odstranit poznámky ještě před jejich předáním parseru!

23
Basel Shishani

Pokud používáte JSON5 můžete zahrnout komentáře.


JSON5 je navrhované rozšíření JSON, jehož cílem je usnadnit lidem psaní a udržování rukou. Dělá to přidáním minimálních syntaktických znaků přímo z ECMAScriptu 5.

20
Smit Johnth

Sada nástrojů Dojo Toolkit JavaScript (minimálně od verze 1.4) vám umožňuje zahrnout do vašeho JSON komentáře. Komentáře mohou být formátu /* */. Dojo Toolkit spotřebovává JSON prostřednictvím volání dojo.xhrGet().

Ostatní sady nástrojů JavaScript mohou fungovat podobně.

To může být užitečné při experimentování s alternativními datovými strukturami (nebo dokonce seznamy dat) před volbou konečné volby.

20
David

JSON není zarámovaný protokol . Je to jazyk bez formátu. Pro JSON tedy není definován formát komentáře.

Jak navrhlo mnoho lidí, existují některé triky, například duplicitní klíče nebo konkrétní klíč _comment, který můžete použít. Je to na tobě.

17

Máte můžete mít komentáře v JSONP , ale ne v čistém JSON. Právě jsem strávil hodinu a snažil se, aby program pracoval s tímto příkladem z Highcharts: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

Pokud budete následovat odkaz, uvidíte

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

Protože jsem měl podobný soubor ve své místní složce, nebyly žádné problémy s politikou Same-Origin , takže jsem se rozhodl použít čistý JSON ... a samozřejmě $.getJSON mlčel kvůli komentářům.

Nakonec jsem na výše uvedenou adresu poslal ruční požadavek HTTP a uvědomil jsem si, že typ obsahu byl text/javascript protože, JSONP vrací čistý JavaScript. V tomto případě jsou komentáře povoleny. Ale moje aplikace vrátila obsah typu application/json, takže jsem musela poznámky odstranit.

17
osa

Toto je otázka "can you". A zde je odpověď "yes".

Ne, neměli byste používat členy duplicitních objektů, aby se do kanálů JSON kódovala data vedlejších kanálů. (Viz "Názvy uvnitř objektu by měly být jedinečné" v RFC ).

A ano, můžete vkládat komentáře kolem JSON , které můžete rozebrat.

Pokud však chcete způsob vkládání a extrahování libovolných dat postranního kanálu na platný JSON, zde je odpověď. Využíváme ne jedinečné reprezentace dat v kódování JSON. To je povoleno* v sekci dva RFC pod "whitespace je povoleno před nebo po některém ze šesti strukturních znaků".

*RFC uvádí pouze "mezery je povoleno před nebo po některém ze šesti strukturních znaků", ne explicitně uvádějící řetězce, čísla, "false", "true" a "null". Toto vynechání je ve všech implementacích ignorováno.


Nejprve můžete kanonizovat svůj JSON tím, že ho zhuštění:

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

Pak kódujte svůj komentář v binárním formátu:

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

Pak si vezměte binární soubor:

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

Zde je váš výstup:

$jsonWithComment = $steg . $jsonMin;
16
William Entriken

Pro náš projekt používáme strip-json-comments . Podporuje něco jako:

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

Stačí npm install --save strip-json-comments nainstalovat a používat jako:

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

Existuje dobré řešení (hack), které je platné JSON. Prostě udělejte stejný klíč dvakrát (nebo více). Například: 

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

JSON to pochopí jako:

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

Chcete-li položku JSON rozdělit na části, přidám řádky „fiktivní komentář“:

{

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

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

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

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

}
10
Chris

JSON to komentoval, ale byly zneužity a odstraněny ze standardu.

Od autora JSON:

Z JSONu jsem odstranil komentáře, protože jsem viděl, že je lidé používají k tomu, aby drželi direktivy analýzy, což je praxe, která by zničila interoperabilitu. Vím, že nedostatek komentářů činí některé lidi smutnými, ale nemělo by to. - Douglas Crockford, 2012

Oficiální stránka JSON je na JSON.org . JSON je definován jako standard ECMA International. Tam je vždy petice proces mít standardy revidované. Je nepravděpodobné, že anotace budou přidány do standardu JSON z několika důvodů.

JSON design je snadno reverzně konstruovaná alternativa k XML. Zjednodušuje se i do té míry, že anotace jsou zbytečné. Není to ani značkovací jazyk. Cílem je stabilita a interoperabilita.

Každý, kdo chápe vztah „má-a“ objektové orientace, může pochopit jakoukoliv strukturu JSON - to je celý bod. Je to pouze řízený acyklický graf (DAG) s tagy uzlů (páry klíč/hodnota), což je téměř univerzální datová struktura.

Tato nutná anotace může být "// Toto jsou značky DAG". Názvy klíčů mohou být podle potřeby informativní.

Každá platforma může analyzovat JSON s několika řádky kódu. XML vyžaduje složité OO knihovny, které nejsou životaschopné na mnoha platformách.

Anotace by jen učinily JSON méně interoperabilní. Není prostě nic, co by se dalo přidat, pokud to, co opravdu potřebujete, je značkovací jazyk (XML), a nezajímá se, zda jsou vaše přetrvávající data snadno analyzována.

9
Dominic Cerisano

Autor JSON chce, abychom do JSONu zahrnuli komentáře, ale před jejich syntézou je rozdělíme (viz link poskytl Michael Burr). JSON by měl mít komentáře, proč ne standardizovat je a nechat JSON parser dělat práci? Nesouhlasím s logikou, ale, bohužel, to je standard. Použití řešení YAML podle doporučení jiných je dobré, ale vyžaduje závislost na knihovně.

Pokud chcete odstranit komentáře, ale nechcete mít závislost na knihovně, zde je dvouřádkové řešení, které funguje pro komentáře ve stylu C++, ale lze je přizpůsobit ostatním:

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

Toto řešení lze použít pouze v případech, kdy si můžete být jisti, že data JSON neobsahují iniciátor komentáře, např. ('//').

Dalším způsobem, jak dosáhnout JSON analýzy, stripping komentářů a žádné další knihovny, je vyhodnotit JSON v JavaScript interpretu. Výhradou tohoto přístupu je samozřejmě to, že byste chtěli pouze vyhodnotit data, která nebyla získána (bez důvěryhodného vstupu uživatele). Zde je příklad tohoto přístupu v Node.js - další upozornění, následující příklad bude pouze číst data jednou a pak bude uložen do mezipaměti:

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

Povzdech. Proč nepřidávat pouze pole, např.

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

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

Jen se ujistěte, že vaše "notex" jména nejsou v rozporu se skutečnými poli.

7
Steve Thomas

JSON můžete použít s komentáři, pokud jej načtete jako textový soubor a poté z něj odeberete komentáře.

K tomu můžete použít decomment knihovna. Níže je uveden úplný příklad.

Vstup JSON (soubor input.js):

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

Zkušební aplikace:

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);
    }
});

Výstup:

{ value: 123 }

Viz také: gulp-decomment , grunt-decomment

7
vitaly-t

Právě jsem našel " grunt-strip-json-comments ".

„Stripujte komentáře od společnosti JSON. To vám umožní používat komentáře ve vašich souborech JSON!

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

Je-li vaším kontextem konfigurace Node.js, můžete jako alternativu k JSON považovat JavaScript za module.exports:

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

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

Syntaxe require bude stále stejná. Přípona souboru JavaScript by měla být .js.

4
Nick

V mém případě potřebuji použít komentáře pro účely ladění, před výstupem struktury JSON. Rozhodl jsem se proto použít v hlavičce HTTP informace o ladění, aby nedošlo k porušení klienta:

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

 Enter image description here

4
WilliamK

Pomocí regulárních výrazů můžete použít jednoduché předzpracování. Následující funkce například dekóduje komentovaný JSON v 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);
}

Podporuje všechny komentáře ve stylu PHP:/*, #, //. String literály jsou zachovány jako je.

3

Pokud používáte PHP, můžete tuto funkci použít k vyhledání a odebrání komentářů typu ///* z řetězce JSON před jeho syntézou do objektu/pole:

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;
   }

Snad to pomůže!

2
Meru-kun

JSON můžete samozřejmě komentovat. Chcete-li číst komentovaný soubor JSON z javascriptu, můžete před syntaktickou analýzou oddělit komentáře (viz kód níže). Jsem si jistý, že tento kód může být vylepšen, ale je snadno pochopitelný pro ty, kteří používají regexp.

Používám komentované JSON soubory pro určení neuronových tvarů pro mé syntetické reflexní systémy. Také používám komentovaný JSON pro ukládání mezilehlých stavů pro běžící neuronový systém. Je velmi vhodné mít komentáře. Neposlouchejte didaktiky, které vám říkají, že jsou špatný nápad.

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

Jak již mnoho odpovědí poukázalo, JSON nemá nativní komentáře. Samozřejmě někdy je chcete. Pro Python jsou dva způsoby, jak to udělat s commentjson (# a // pouze pro Python 2) nebo json_tricks (# nebo // pro Python 2 a Python 3), který má několik dalších funkce. Disclaimer: Udělal jsem json_tricks.

2
Mark

Praktickou odpovědí pro uživatele VSCode v roce 2019 je použití rozšíření „jsonc“.

Praktické, protože to je rozšíření rozpoznané VSCode pro označení "JSON s komentáři". Prosím, dejte mi vědět o dalších editorech/IDE v komentářích níže.

Bylo by hezké, kdyby VSCode a další editory přidali nativní podporu i pro 'json5', ale nyní VSCode obsahuje pouze podporu pro 'jsonc'.

(Před odesláním všech těchto odpovědí jsem prohledal všechny odpovědi a žádný nezmínil výraz „jsonc“.)

1
Tom

Ano, můžete mít komentáře. Ale nedoporučuji žádný z výše uvedených důvodů.

Udělal jsem nějaké vyšetřování a zjistil jsem, že všechny metody JSON vyžadují metodu JSON.parse. Tak jsem přišel k řešení: Můžeme přepsat nebo udělat opičí záplaty kolem JSON.parse.

Poznámka: testováno pouze na Node.js ;-)

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

Soubor JSON:

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

Narazil jsem na tento problém v mém současném projektu, protože mám dost JSON, který vyžaduje nějaké komentáře, aby se věci snadno zapamatovaly.

Použil jsem tuto jednoduchou funkci python k nahrazení komentářů a použití json.loads k převodu na dict:

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

K správnému napsání komentářů můžete použít JSON-LD a typ komentáře schema.org

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

* .json soubory jsou obecně používány jako konfigurační soubory nebo statická data, takže je třeba komentáře → některé editory jako NetBeans přijímají kompromisy v * .json.

Problém je analyzování obsahu objektu. Řešením je vždy použít čisticí funkci (server nebo klient).

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

Existují i ​​další knihovny, které jsou kompatibilní s JSON, které podporují komentáře.

Jeden pozoruhodný příklad je “Hashcorp jazyk” (HCL) . To je napsáno stejnými lidmi, kteří dělali Vagrant, packer, konzul a vault.

0
spuder

Toto celé vlákno předpokládá, že přidávání komentářů je jediným zlepšením, které je třeba udělat pro JSON. Pokud někdo nechce komentáře v JSONu, protože má být použit pro serializaci, vynechejte komentáře. Totéž platí pro mezery. Ale proč se tam zastavit? Proč jsou uvozovky povinné v JSON? Nepřidávají nic užitečného.

Jediný důvod, proč si můžu myslet, že JSON je tak rigidní, je, pokud je analýza složitá. Ale není to tak. Téměř každý programátor může zapisovat analyzátor JSON v obou směrech.

Chci, aby byl JSON čitelný a účinný (stručný) a užitečný pro přenos dat, konfigurační soubory a mnoho dalšího. Oba tyto požadavky splňuje následující příklad:

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

Kratší než jakákoliv existující specifikace JSON, ale stejně čitelná a efektivnější.

Potřebujete zahrnout uvozovky, apostrofy, čárky nebo závorky do vlastnosti nebo hodnoty? Stačí je uzavřít do otazníků nebo apostrofů (s únikem zpětného lomítka), stejně jako v JavaScriptu.

Uveďte prosím uvozovky nepovinné. Proč? Protože JSON nemůže obsahovat názvy proměnných nebo funkcí (aby se zabránilo injekčním útokům), uvozovky nezajišťují žádnou disambiguaci. Už víme, že všechna data jsou řetězce. Takže, prosím, vynechejte uvozovky, pokud nejsou opravdu potřeba.

0
David Spector