Ao gerar manualmente um objeto ou matriz JSON, geralmente é mais fácil deixar uma vírgula à direita no último item do objeto ou matriz. Por exemplo, o código para saída de uma matriz de seqüências de caracteres pode parecer (em um C ++ como pseudocódigo):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
dando-lhe uma corda como
[0,1,2,3,4,5,]
Isso é permitido?
alert([1, 2, 3, ].length)
exibirá "4".Respostas:
Infelizmente, a especificação JSON não permite uma vírgula à direita. Existem alguns navegadores que permitirão, mas geralmente você precisa se preocupar com todos os navegadores.
Em geral, tento mudar o problema e adicionar vírgula antes do valor real, para que você acabe com um código parecido com este:
Essa linha de código extra no seu loop for dificilmente é cara ...
Outra alternativa que usei ao gerar uma estrutura para JSON a partir de um dicionário de alguma forma é sempre acrescentar uma vírgula após cada entrada (como você está fazendo acima) e depois adicionar uma entrada fictícia no final que não tem vírgula à direita (mas isso é apenas preguiçoso; ->).
Infelizmente, não funciona bem com uma matriz.
fonte
if
s apenas para evitar essa pequena vírgula estúpida. Sobre o custo YMMV, veja isso por exemplo jsfiddle.net/oriadam/mywL9384 Esclarecimento: Sua solução é ótima, eu odeio especificações que proíbem uma vírgula à direita.Não. A especificação JSON, mantida em http://json.org , não permite vírgulas finais. Pelo que vi, alguns analisadores podem silenciosamente permitir a leitura de uma string JSON, enquanto outros geram erros. Para interoperabilidade, você não deve incluí-lo.
O código acima pode ser reestruturado, para remover a vírgula à direita ao adicionar o terminador da matriz ou para adicionar a vírgula antes dos itens, ignorando o da primeira.
fonte
Simples, barato, fácil de ler e sempre funciona, independentemente das especificações.
A atribuição redundante a $ delim é um preço muito pequeno a pagar. Também funciona tão bem se não houver loop explícito, mas fragmentos de código separados.
fonte
if
é mais fácil de entender. Mas obrigado por compartilhar.for(let ..., sep=""; ... ; sep=",") { ...
Vírgulas finais são permitidas em JavaScript, mas não funcionam no IE. A especificação JSON sem versão de Douglas Crockford não os permitia e, como era sem versão, isso não deveria mudar. A especificação JSON ES5 permitiu-os como uma extensão, mas o RFC 4627 de Crockford não, e o ES5 reverteu a proibi-los. O Firefox seguiu o exemplo. O Internet Explorer é o motivo pelo qual não podemos ter coisas agradáveis.
fonte
Como já foi dito, a especificação JSON (baseada no ECMAScript 3) não permite vírgula à direita. ES> = 5 permite, para que você possa realmente usar essa notação em JS puro. Foi discutido e alguns analisadores o apoiaram ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas- não é mais aceito / ), mas é o fato das especificações (como mostrado em http://json.org/ ) que não deve funcionar no JSON. Aquilo disse ...
... Estou me perguntando por que ninguém apontou que você pode realmente dividir o loop na 0ª iteração e usar vírgula à esquerda, em vez de arrastar uma para se livrar do cheiro do código de comparação e de qualquer sobrecarga de desempenho real no loop, resultando em um código realmente mais curto, mais simples e mais rápido (devido a nenhuma ramificação / condicional no loop) do que outras soluções propostas.
Por exemplo (em um pseudocódigo no estilo C semelhante ao código proposto pelo OP):
fonte
Os codificadores PHP podem querer verificar implode () . Isso leva uma matriz junta-lo usando uma seqüência de caracteres.
Dos documentos ...
fonte
Curiosamente, tanto o C & C ++ (e acho que o C #, mas não tenho certeza) permitem especificamente a vírgula à direita - exatamente pelo motivo exposto: facilita muito a geração de listas por meio de programação. Não sei por que o JavaScript não seguiu sua liderança.
fonte
Use JSON5. Não use JSON.
http://json5.org/
https://github.com/aseemk/json5
fonte
Existe uma maneira possível de evitar uma ramificação if no loop.
fonte
De acordo com a especificação da classe JSONArray :
Então, pelo que entendi, deve ser permitido escrever:
Mas pode acontecer que alguns analisadores retornem o 7 como contagem de itens (como o IE8, como Daniel Earwicker apontou) em vez do esperado 6.
Editado:
Encontrei este JSON Validator que valida uma string JSON no RFC 4627 (o tipo de mídia application / json para JavaScript Object Notation) e na especificação da linguagem JavaScript. Atualmente, uma matriz com vírgula à direita é considerada válida apenas para JavaScript e não para a especificação RFC 4627.
No entanto, na especificação RFC 4627, é afirmado que:
Para mim, isso é novamente um problema de interpretação. Se você escrever que os Elementos são separados por vírgulas (sem declarar algo sobre casos especiais, como o último elemento), pode ser entendido de ambas as maneiras.
O PS RFC 4627 não é um padrão (como explicitamente declarado) e já está obsoleto pelo RFC 7159 (que é um padrão proposto) RFC 7159
fonte
value-separator
sem umvalue
direito ao lado dele. Além disso, o texto é muito específico. "Separação de valores" só pode ser aplicada se houver vários valores. Portanto, se você tiver dois valores próximos um do outro, eles serão separados por vírgula. Se você tiver um valor (ou se você apenas observar o valor no final), não haverá separação, portanto não haverá vírgula.De minha experiência anterior, descobri que diferentes navegadores lidam com vírgulas finais no JSON de maneira diferente.
O Firefox e o Chrome lidam perfeitamente com isso. Mas o IE (todas as versões) parece quebrar. Quero dizer, realmente quebrar e parar de ler o resto do script.
Tendo isso em mente, e também o fato de sempre ser bom escrever código compatível, sugiro que se dedique um esforço extra para garantir que não haja vírgula à direita.
:)
fonte
Eu mantenho uma contagem atual e a comparo com uma contagem total. Se a contagem atual for menor que a contagem total, eu mostro a vírgula.
Pode não funcionar se você não tiver uma contagem total antes de executar a geração JSON.
Então, novamente, se você estiver usando o PHP 5.2.0 ou melhor, poderá formatar sua resposta usando a API JSON incorporada.
fonte
Com o JSON relaxado, você pode ter vírgulas à direita ou deixá-las de fora . Eles são opcionais.
Não há razão para que todas as vírgulas precisem estar presentes para analisar um documento semelhante ao JSON.
Dê uma olhada na especificação JSON relaxada e você verá o quão barulhenta é a especificação JSON original. Muitas vírgulas e aspas ...
http://www.relaxedjson.org
Você também pode experimentar seu exemplo usando este analisador RJSON online e vê-lo sendo analisado corretamente.
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
fonte
json object
utilizaçãoJSON.parse
ou uma biblioteca usandoRJSON.parse
. Eu concordaria com você se a fonte fosse um objeto, mas esse não é o caso aqui. Não vejo onde na pergunta ele mencionadownstream
consumir um objeto ou string.Normalmente, faço um loop na matriz e anexo uma vírgula após cada entrada na string. Após o loop, apago a última vírgula novamente.
Talvez não seja o melhor caminho, mas menos caro do que verificar todas as vezes se é o último objeto do circuito, eu acho.
fonte
Não é recomendado, mas você ainda pode fazer algo assim para analisá-lo.
fonte
Como um loop for é usado para iterar sobre uma matriz ou uma estrutura de dados iterável semelhante, podemos usar o comprimento da matriz como mostrado,
Com datafile.txt contendo,
fonte
Como afirmado, não é permitido. Mas em JavaScript, isto é:
(funciona bem no Firefox, Chrome, Edge, IE11 e sem a permissão do IE9, 8, 7, 5)
fonte