Os comentários podem ser usados em JSON?

Posso usar os comentários dentro de um ficheiro JSON? Em caso afirmativo, como?

 5953
Author: Steve Chambers, 2008-10-28

30 answers

Não.

O JSON deve ser todos dados, e se você incluir um comentário, então serão dados também.

Você poderia ter um elemento de dados designado chamado "_comment" (ou algo assim) que seria ignorado pelos aplicativos que usam os dados JSON.

Você provavelmente seria melhor ter o comentário nos processos que geram/recebem o JSON, já que eles devem saber quais os dados JSON serão antecipadamente, ou pelo menos a estrutura do mesmo.

Mas se decidires to:

{
   "_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"
            }
         }
      }
   }
}
 4184
Author: Eli, 2018-04-03 11:57:40

Não são permitidos comentários no formulário//… ou /*…*/ em JSON. Esta resposta baseia-se em:

  • http://www.json.org
  • RFC 4627 : O tipo de Mídia application/json para a notação de objeto JavaScript (JSON)
  • RFC 7159 The JavaScript Object Notation (JSON) Data Interchange Format - Obsoletes: 4627, 7158

 1592
Author: stakx, 2016-06-03 07:20:04

Inclua os comentários se quiser; remova-os com um minifier antes de analisar ou transmitir.

Acabei de me libertar. JSON.minify() o que retira comentários e espaços em branco de um bloco da JSON e o torna válido JSON que pode ser analisado. Então, você pode usá-lo como:
JSON.parse(JSON.minify(my_str));
Quando o publiquei, tive uma enorme repercussão de pessoas que discordavam da ideia, por isso decidi escrever um artigo completo no blog sobre o porquê dos comentários. faz sentido no JSON. Ele inclui este comentário notável do criador de JSON:

Suponha que está a usar o JSON para manter os ficheiros de configuração, que gostaria de anotar. Vá em frente e insira todos os comentários que você gosta. Então passa-o pelo JSMin antes de o entregares ao teu parceiro JSON. Douglas Crockford., 2012

Espero que isso seja útil para aqueles que discordam do porquê do JSON.minify () pode ser útil.
 693
Author: Kyle Simpson, 2017-01-20 13:40:10

Os comentários foram removidos da JSON por design.

Removi Comentários da JSON porque vi pessoas a usá-los para manter directivas de Análise, uma prática que teria destruído a interoperabilidade. Sei que a falta de comentários deixa algumas pessoas tristes, mas não devia.

Suponha que está a usar o JSON para manter os ficheiros de configuração, que gostaria de anotar. Vá em frente e insira todos os comentários que você gosta. Então passa-o pelo JSMin antes de o entregares. o teu parceiro JSON.

Fonte: declaração pública de Douglas Crockford sobre G+

 387
Author: Artur Czajka, 2012-07-30 21:48:12

DECLARAÇÃO DE EXONERAÇÃO DE RESPONSABILIDADE: A SUA GARANTIA É NULA

Como já foi dito, este hack aproveita-se da implementação do spec. Nem todos os parsers da JSON vão entender este tipo de JSON. O Streaming de parsers em particular vai sufocar. É uma curiosidade interessante, mas não devias usá-la para nada. Abaixo está a resposta original.
Encontrei um pequeno hack que lhe permite colocar comentários num ficheiro JSON que não irá afectar a análise, ou alterar os dados que estão sendo representados de alguma forma.

Parece que ao declarar um objeto literal você pode especificar dois valores com a mesma chave, e o último tem precedência. Acredites ou não, parece que o JSON parsers trabalha da mesma maneira. Então nós podemos usar isso para criar comentários na fonte JSON que não estarão presentes em uma representação de objetos analisados.

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1
Se aplicarmos esta técnica, o seu ficheiro JSON comentado pode parecer isto:
{
  "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]
}

O código acima é válido JSON . Se o analisares, terás um objecto como este.

{
    "api_host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}
O que significa que não há vestígios dos comentários e que não terão efeitos secundários estranhos. Boa pirataria!
 197
Author: Ped, 2016-01-15 05:58:51

O JSON não suporta comentários. Ele também nunca foi destinado a ser usado para arquivos de configuração onde os comentários seriam necessários.

O Hjson é um formato de ficheiro de configuração para humanos. Sintaxe relaxada, menos erros, mais comentários.

Hjson intro

Ver hjson.org para bibliotecas JavaScript, Java, Python, PHP, Rust, Go, Ruby e C#.

 130
Author: laktak, 2016-08-09 21:20:28
Pelo menos essa é a minha experiência com um olhar rápido. json.org.

O JSON tem a sua sintaxe visualizada nessa página. Não há nenhuma nota sobre comentários.

 95
Author: Cheery, 2017-01-19 17:20:33

Considere usar o YAML. É quase um superconjunto de JSON (praticamente todos os JSON válidos são YAML válidos) e permite comentários.

 87
Author: Marnen Laibow-Koser, 2011-08-31 02:24:26

Devias escrever umesquema JSON em vez disso. JSON schema é atualmente uma proposta de especificação de projeto da Internet. Além da documentação, o esquema também pode ser usado para validar seus dados JSON.

Exemplo:

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

Pode fornecer documentação utilizando o atributo description schema.

 56
Author: raffel, 2017-01-19 17:37:30

Se está a usar Jackson como seu parser JSON, então é assim que o permite permitir comentários:

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

Então você pode ter comentários como este:

{
  key: "value" // comment
}

E também pode ter comentários a começar por # definindo:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);    

Mas em geral (como respondido antes) o spec não permite comentários.

 53
Author: Andrejs, 2018-06-14 08:38:01

Os comentários não são uma norma oficial. Embora alguns parsers suportam comentários de estilo C. Um que eu uso é JsonCpp . Nos exemplos há Este:

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

O Jsonlint não valida isto. Assim, os comentários são uma extensão específica do analisador e não padrão.

Outro analisador é JSON5 .

Uma alternativa ao JSON TOML.

 50
Author: schoetbi, 2017-01-19 17:46:32

Aqui está o que encontrei na documentação do Google Firebase que lhe permite colocar comentários em 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"
}
 41
Author: mana, 2017-06-22 13:05:19
Desculpa, não podemos usar comentários no JSON... Veja o diagrama de sintaxe para JSON em JSON.org. Douglas Crockford diz: "Por que ele removeu comentários em JSON e forneceu uma forma alternativa de fazer isso"":
Removi comentários do JSON porque vi pessoas a usá-los para ... manter as directivas de Análise, uma prática que teria destruído interoperacionalidade. Sei que a falta de comentários faz com que algumas pessoas triste, mas não devia.

Suponha que está a usar o JSON para manter os ficheiros de configuração, que você gostaria de anotar. Vá em frente e insira todos os comentários que você gosta. Então passa-o pelo JSMin antes de o entregares ao teu parceiro JSON.

 40
Author: NavaRajan, 2017-01-19 17:53:45

Se o seu ficheiro de texto, que é uma cadeia de caracteres JSON, for lido por algum programa, quão difícil seria remover os comentários do estilo C ou C++ antes de O usar?

Resposta: seria uma linha única. Se você fizer isso, então arquivos JSON podem ser usados como arquivos de configuração.

 37
Author: John T. Vonachen, 2015-08-29 17:51:26

Se estiver a usar o Newtonsoft.Biblioteca Json com ASP.NET para ler / deserializar, poderá usar os comentários no conteúdo do JSON:

/ / "Nome":"string"

/ / "id": int

Ou

/* Isto é um

Exemplo de comentário * /

PS: Os comentários em Linha Única só são suportados com 6 + versões do Newtonsoft Json.

Nota adicional para pessoas que não conseguem pensar fora da caixa: uso o formato JSON para a configuração básica em um ASP.NET aplicação web que eu fiz. Eu li O arquivo, converto - o para o objeto de configuração com a biblioteca Newtonsoft e usá-lo quando necessário.

Eu prefiro escrever comentários sobre cada configuração individual no próprio arquivo JSON, e eu realmente não me importo com a integridade do formato JSON, desde que a biblioteca que eu uso esteja OK com ele.

Acho que esta é uma maneira 'mais fácil de usar/compreender' do que criar uma configuração separada.Processo README e explicação do as configurações nele.

Se você tem um problema com este tipo de uso; desculpe, o gênio está fora da lâmpada. As pessoas iriam encontrar outros usos para o formato JSON, e não há nada que você possa fazer sobre isso.

 33
Author: dvdmn, 2017-01-19 18:21:52
A ideia por trás do JSON é fornecer um simples intercâmbio de dados entre aplicações. Estes são tipicamente baseados na web e a linguagem é JavaScript.

Realmente não permite comentários como tal, no entanto, passar um comentário como um dos pares nome / valor nos dados certamente funcionaria, embora esses dados obviamente precisassem ser ignorados ou tratados especificamente pelo código de análise.

Tudo o que disse, não é intenção que o ficheiro JSON contenha comentários no sentido tradicional. Devem ser só os dados.

Dê uma olhada no site JSON para mais detalhes.

 28
Author: Neil Albrock, 2017-01-19 17:25:29
Só encontrei isto para os ficheiros de configuração. I don't want to use XML (verbose, graphically, ugly, hard to read), or "ini" format (no hierarchy, no real standard, etc.) ou Java "Properties" format (like .ini). O JSON pode fazer tudo o que pode, mas é muito menos verboso e mais legível para o ser humano - e os parceiros são fáceis e omnipresentes em muitas línguas. É só uma árvore de dados. Mas Comentários fora de banda são muitas vezes uma necessidade de documentar configurações "default" e semelhante. Configurações nunca devem ser "documentos completos", mas árvores de dados salvos que podem ser legíveis quando necessário.

Acho que se pode usar "#": "comment", para "válido" JSON.

 27
Author: peterk, 2017-01-19 17:42:10

O JSON não suporta comentários nativamente, mas você pode fazer o seu próprio descodificador ou pelo menos o pré-processador para remover comentários, isso é perfeitamente normal (desde que você apenas ignore comentários e não os use para orientar como a sua aplicação deve processar os dados JSON).

O JSON não tem comentários. Um codificador JSON não deve emitir comentários. Um descodificador JSON pode Aceitar e ignorar comentários.

Os comentários nunca devem ser usados para transmitir algo significativo. Isto é ... para que serve o JSON.

Cf: Douglas Crockford, autor de JSON spec .

 26
Author: gaborous, 2013-06-25 14:48:56
Depende da tua biblioteca JSON. Json.NET suporta os comentários do estilo JavaScript, /* commment */.

Ver outra questão de estouro da pilha .

 26
Author: AZ., 2017-05-23 10:31:37

O JSON faz muito sentido para ficheiros de configuração e outros usos locais porque é omnipresente e porque é muito mais simples do que o XML.

Se as pessoas têm fortes razões para não ter comentários em JSON quando comunicam dados (válidos ou não), então possivelmente JSON pode ser dividido em dois:

    JSON-COM: JSON on the wire, or rules that apply when communicating JSON data.
  • JSON-DOC: documento JSON, ou JSON em ficheiros ou localmente. Regras que definem um JSON válido documento.

O JSON-DOC permitirá comentários, e poderão existir outras pequenas diferenças, tais como lidar com espaços em branco. Os Parsers podem facilmente converter de uma spec para a outra.

No que diz respeito à observação feita por Douglas Crockford sobre estas questões (referenciada por @Artur Czajka)

Suponha que está a usar o JSON para manter os ficheiros de configuração, que gostaria de anotar. Vá em frente e insira todos os comentários que você gosta. Então passa pelo JSMin antes a entregá-lo ao seu agente da JSON.

Estamos a falar de um problema genérico de ficheiros de configuração (linguagem cruzada/plataforma), e ele está a responder com um utilitário específico do JS!

De certeza que um minify específico do JSON pode ser implementado em qualquer língua, mas padronizar isso para que se torne onipresente em todos os parsers em todas as línguas e plataformas para que as pessoas parem de perder seu tempo faltando o recurso, porque eles têm bons casos de uso para ele, olhando o problema em fóruns on-line, e obter pessoas dizer-lhes que é uma má ideia ou sugerir que é fácil implementar comentários de remoção de arquivos de texto.

A outra questão é a interoperabilidade. Suponha que você tenha uma biblioteca ou API ou qualquer tipo de sub-sistema que tenha alguma configuração ou arquivos de dados associados a ela. E este subsistema é para ser acessado a partir de diferentes idiomas. Então vais dizer às pessoas: não se esqueça de retirar os comentários dos arquivos JSON antes de passá-los para o analisador!

 23
Author: Basel Shishani, 2013-01-25 14:45:56

O toolkit do Dojo JavaScript toolkit (pelo menos a partir da versão 1.4), permite-lhe incluir comentários no seu JSON. Os comentários podem ser de /* */ formato. O Toolkit Dojo consome o JSON através da chamada dojo.xhrGet().

Outras ferramentas de JavaScript podem funcionar da mesma forma.

Isto pode ser útil ao experimentar com estruturas de dados alternativas (ou mesmo listas de dados) antes de escolher uma opção final.

 20
Author: David, 2017-01-19 17:39:46

Se utilizar JSON5 pode incluir comentários.


JSON5 é uma extensão proposta para JSON que visa tornar mais fácil para os seres humanos para escrever e manter à mão. Ele faz isso adicionando algumas características de sintaxe mínimas diretamente do ECMAScript 5.

 19
Author: Smit Johnth, 2017-01-19 18:32:25

Você Podeter comentários em JSONP, mas não em JSON puro. Passei uma hora a tentar que o meu programa funcionasse com este exemplo dos Highcharts. http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

Se seguires o link, verás

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

Uma vez que eu tinha um arquivo similar na minha pasta local, não havia problemas com a Política de mesma origem, Então eu decidi usar JSON puro... e, claro, $.getJSON não estava a funcionar silenciosamente por causa dos comentários.

Eventualmente acabei de enviar um pedido HTTP manual para o endereço acima e percebi que o tipo de conteúdo era {[[2]} uma vez que, bem, o JSONP devolve JavaScript puro. Neste caso, são permitidas observações . Mas a minha aplicação devolveu o tipo de conteúdo application/json, por isso tive de remover os comentários.

 17
Author: osa, 2017-01-19 18:00:16

O JSON não é um protocolo emoldurado. It is a language free format . Então o formato de um comentário não é definido para JSON.

Como muitas pessoas sugeriram, existem alguns truques, por exemplo, chaves duplicadas ou uma chave específica {[[0]} que você pode usar. Depende de ti.

 17
Author: Manish Shrivastava, 2017-01-19 18:24:14
Esta é uma pergunta. E aqui está uma resposta: sim.

Não, não deve usar membros de objectos duplicativos para colocar os dados dos canais laterais numa codificação JSON. (Veja "os nomes dentro de um objeto devem ser únicos" na RFC ).

E sim, você poderia inserir comentários em torno de {[18] } o JSON , que você poderia analisar.

Mas se quiser uma forma de inserir e extrair dados arbitrários de canais laterais para um JSON válido, aqui está uma resposta. Aproveitamos a representação Não-única de dados em uma codificação JSON. Isto é permitido* na seção dois do RFC sob "whitespace is allowed before or after any of the six structural characters".

*a RFC apenas afirma que "espaço em branco é permitido antes ou depois de qualquer um dos seis caracteres estruturais", não mencionando explicitamente strings, números, "false", "true", E "null". Esta omissão é ignorada em todos implementacao.


Primeiro, canonicalize o seu JSON minificando-o.
$jsonMin = json_encode(json_decode($json));

Depois codificar o seu comentário em binário:

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

Então estica o teu binário:

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

Aqui está a tua saída:

$jsonWithComment = $steg . $jsonMin;
 16
Author: William Entriken, 2015-12-15 05:53:41
Estamos a usar strip-json-comments para o nosso projecto. Ele suporta algo como:
/*
 * Description 
*/
{
    // rainbows
    "unicorn": /* ❤ */ "cake"
}

Simplesmente npm install --save strip-json-comments para o instalar e usar como:

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}
 11
Author: Joy, 2014-11-27 11:39:27

Para cortar um item JSON nas partes, adiciono linhas de "comentário falso":

{

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

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

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

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

}
 10
Author: Chris, 2017-01-19 18:01:59

Existe uma boa solução (hack), que é válido JSON. Basta fazer a mesma chave duas vezes (ou mais). Por exemplo:

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

Então o JSON vai entender isto como:

{
  "param" : "This is value place",
}
 10
Author: Aurimas, 2017-10-24 09:25:48
Suspiro. Por que não adicionar apenas campos, por exemplo
{
    "note1" : "This demonstrates the provision of annotations within a JSON file",
    "field1" : 12,
    "field2" : "some text",

    "note2" : "Add more annotations as necessary"
}
Certifica-te que os teus nomes não entram em conflito com campos reais.
 7
Author: Steve Thomas, 2013-11-28 13:48:59

O autor de JSON quer que incluamos comentários no JSON, mas removê-los antes de analisá-los (ver link fornecido por Michael Burr.) Se JSON deve ter comentários, por que não padronizá-los, e deixar o json parser fazer o trabalho? Não concordo com a lógica, mas, infelizmente, esse é o padrão. Usar a solução YAML como sugerido por outros é bom, mas requer dependência de bibliotecas.

Se quiser retirar os comentários, mas não quiser ter uma dependência da biblioteca, aqui está uma solução de duas linhas, que funciona para Comentários de estilo C++, mas pode ser adaptada para outros:

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

Note que esta solução só pode ser usada nos casos em que você pode ter certeza de que os dados JSON não contêm o iniciador de comentários, por exemplo ('//').

Outra maneira de conseguir a participação da JSON, a remoção de comentários, e nenhuma biblioteca extra, é avaliar a JSON num intérprete da JS. A ressalva com essa abordagem, é claro, é que você só iria querer avaliar dados não mantidos (não dados não confiáveis do utilizador.) Aqui está um exemplo desta abordagem no nó.js -- outra advertência, a seguir o exemplo, só irá ler os dados uma vez e então será Cache:
data = require(fs.realpathSync(doctree_fp));
 7
Author: Joshua Richardson, 2013-12-11 23:59:51