Qual é a diferença entre YAML e JSON? Quando preferir um ao outro
- Desempenho (codificar/descodificar o tempo)
- consumo de memória
- expressão clareza
- disponibilidade da Biblioteca, facilidade de Utilização (Prefiro C)
relacionado:
11 answers
Ver as especificações oficiais, na secção intitulada "YAML: Relation to JSON" .
Em geral, há certas coisas que gosto no YAML que não estão disponíveis no JSON.- como @jdupont apontou , o YAML é visualmente mais fácil de ver. De facto, a página inicial de YAML é ela própria. válido YAML, mas é fácil para um humano ler.
- YAML tem a capacidade de referenciar outros itens dentro de um arquivo YAML usando "âncoras."Assim, ele pode lidar com informações relacionais como se pode encontrar em um banco de dados MySQL.
- o YAML é mais robusto em incorporar outros formatos de serialização, como o JSON ou o XML dentro de um ficheiro YAML.
Diferenças:
- YAML, dependendo de como você o usa, pode ser mais legível do que JSON
- o JSON é frequentemente mais rápidoe provavelmente ainda é interoperável com mais sistemas É possível escrever um" bom o suficiente " json parser muito rapidamente.
- chaves duplicadas, que são potencialmente JSON válido, são definitivamente YAML inválido.
- YAML tem uma tonelada de características, incluindo comentários e âncoras relacionais. A sintaxe do YAML está em conformidade bastante complexo, e pode ser difícil de entender.
- é possível escrever estruturas recursivas em yaml:
{a: &b [*b]}
, que irá circular infinitamente em alguns conversores. Mesmo com detecção circular, uma "bomba yaml" ainda é possível (ver bomba xml). - Como não há referências, é impossível serializar estruturas complexas com referências de objetos em JSON. A serialização da YAML pode, portanto, ser mais eficiente.
- em alguns ambientes de codificação, o uso de YAML pode permitir um atacante para executar código arbitrário .
Observações:
- programadores Python são geralmente grandes fãs da YAML, devido ao uso de indentação, em vez de sintaxe entre parênteses, para indicar níveis.
- muitos programadores consideram o apego do "significado" à indentação uma má escolha.
- Se o formato dos dados estiver a deixar o ambiente de uma aplicação, processado dentro de uma UI, ou enviado numa camada de mensagens, o JSON poderá ser melhor escolha.
- YAML pode ser usado, diretamente, para tarefas complexas como definições gramaticais, e muitas vezes é uma escolha melhor do que inventar uma nova linguagem.
Isto responde ao título, não aos detalhes, pois a maioria lê apenas o título a partir de um resultado de pesquisa no google como eu, então eu senti que era necessário explicar a partir de uma perspectiva de desenvolvimento web.
- o YAML usa indentação de espaços em branco, que é um território familiar para os programadores Python.
- os desenvolvedores de JavaScript adoram o JSON porque ele é um subconjunto do JavaScript e pode ser interpretado e escrito diretamente dentro do JavaScript, juntamente com o uso uma forma abreviada de declarar o JSON, não exigindo aspas nas teclas ao usar nomes variáveis típicos sem espaços. Há uma infinidade de parsers que funcionam muito bem em todas as línguas, tanto para a YAML como para a JSON.
- o formato de espaço em branco de YAML pode ser muito mais fácil de ver em muitos casos porque a formatação requer uma abordagem mais legível para o homem.
- o espaço em branco de YAML, sendo mais compacto e mais fácil de ver, pode ser enganosamente difícil de editar à mão se não tiver indicadores de linhas de espaços em branco visíveis ou de indentação no seu editor.
- JSON é muito mais rápido para serializar e deserializar por causa de significativamente menos recursos do que YAML para verificar, o que permite código menor e mais leve para processar JSON.
- um equívoco comum é que YAML precisa de menos pontuação e é mais compacto do que JSON, mas isto é completamente falso. O espaço em branco é invisível, por isso parece que há menos caracteres, mas se contarmos o espaço em branco real que é necessário estar lá para YAML para ser interpretado corretamente, juntamente com a indentação adequada, você vai encontrar YAML realmente requer mais personagens do que JSON. JSON não usa espaços em branco para representar hierarquia ou agrupamento e pode ser facilmente achatado com espaços em branco desnecessários removidos para transporte mais compacto.
O elefante na sala: a própria Internet
O JavaScript domina tão claramente a web por uma enorme margem e os programadores de JavaScript preferem usar o JSON como o formato de dados esmagadoramente, juntamente com APIs Web popular, então torna-se difícil argumentar usando YAML sobre JSON ao fazer programação web no sentido geral, como você provavelmente será ultrapassado em um ambiente de equipe. Na verdade, a maioria dos programadores da web nem sequer sabem que a YAML existe, quanto mais considerar usá-la.
Se você está fazendo qualquer programação web, JSON é o caminho padrão para ir, porque nenhum passo de tradução é necessário ao trabalhar com JavaScript então você deve chegar a um melhor argumento para usar YAML sobre JSON nesse caso.
Velocidade
Obviamente, isto depende da implementação, mas porque o JSON é tão amplamente utilizado, e tão fácil de implementar, ele tende a receber maior apoio nativo, e, portanto, velocidade. Considerando que a YAML faz tudo o que a JSON faz, mais uma carga de mais, é provável que de qualquer implementação comparável de ambos, JSON one será mais rápido.No entanto, dado que um ficheiro YAML pode ser ligeiramente inferior ao seu equivalente JSON (devido a menos caracteres {[[0]} e ,
), é possívelque um analisador YAML altamente optimizado possa ser mais rápido em circunstâncias excepcionais.
Memória
Basicamente, aplica-se o mesmo argumento. É difícil perceber porque é que um analisador YAML seria mais eficiente em termos de memória do que um analisador JSON, se representasse os mesmos dados. estrutura.Expressividade
Como observado por outros, programadores Python tendem a preferir YAML, programadores JavaScript para JSON. Vou fazer estas observações:
- É fácil memorizar toda a sintaxe do JSON, e, portanto, estar muito confiante em compreender o Significado de qualquer ficheiro JSON. YAML não é verdadeiramente compreensível por nenhum humano. O número de subtilezas e casos extremos é extremo.
Porque poucos parsers implementam o spec inteiro, está empatado. é mais difícil ter certeza sobre o Significado de uma determinada expressão em um determinado contexto.
A falta de comentários no JSON é, na prática, uma verdadeira dor.
Portabilidade
É difícil imaginar uma linguagem moderna sem uma biblioteca JSON. Também é difícil imaginar um parser da JSON a implementar algo menos do que a especificação completa. YAML tem suporte generalizado, mas é menos ubíquo que JSON, e cada parser implementa um subconjunto diferente. Assim, os arquivos YAML são menos interoperáveis do que podes pensar.Resumo
O JSON é o vencedor do desempenho (se relevante) e da interoperabilidade. YAML é melhor para arquivos mantidos por humanos. HJSON é um compromisso decente, embora com uma portabilidade muito reduzida. JSON5 é um compromisso mais razoável, com uma sintaxe bem definida.
Eu acho YAML para ser mais fácil nos olhos: menos parêntesis, "" etc. Embora haja o aborrecimento de tabs em YAML... mas Apanha-se o jeito.
Em termos de desempenho / recursos, não esperaria grandes diferenças entre os dois. Além disso, estamos a falar de ficheiros de configuração e por isso não esperaria uma alta frequência de actividade de codificar/descodificar, pois não?Se você não precisa de quaisquer recursos que a YAML tem e a JSON não, eu preferiria o JSON porque é muito simples e é amplamente suportado (tem muitas bibliotecas em muitos idiomas). A YAML é mais complexa e tem menos apoio. Eu não acho que a velocidade de análise ou uso de memória será muito diferente, e talvez não uma grande parte do desempenho do seu programa.
GIT e YAML
As outras respostas são boas. Lê isso primeiro. Mas vou acrescentar outra razão para usar YAML às vezes: git .Cada vez mais, muitos projectos de programação utilizam repositórios git para distribuição e arquivamento. E, enquanto a história de um git repo pode igualmente armazenar arquivos JSON e YAML, o método" diff " usado para rastrear e exibir mudanças em um arquivo é orientado para a linha. Uma vez que o YAML é forçado a ser orientado para a linha, quaisquer pequenas alterações em um arquivo YAML são mais fáceis ver por um humano.
É verdade, é claro, que os arquivos JSON podem ser "feitos bonitos" ordenando as cadeias de caracteres/teclas e adicionando indentação. Mas este não é o padrão e eu sou preguiçoso.
Pessoalmente, geralmente uso JSON para interacção sistema-sistema. Eu muitas vezes uso YAML para arquivos de configuração, arquivos estáticos e arquivos rastreados. (I also generally avoid adding YAML relational anchors. A vida é demasiado curta para caçar laços.)
Além disso, se a velocidade e o espaço são uma preocupação, não uso ou. É melhor veres o BSON.Tecnicamente YAML oferece muito mais do que JSON (YAML v1.2 é um superconjunto do JSON):
- comentários
-
Âncoras e herança-exemplo de 3 itens idênticos:
item1: &anchor_name name: Test title: Test title item2: *anchor_name item3: <<: *anchor_name # You may add extra stuff.
- ...
Na maioria das vezes as pessoas não vão usar essas características extras e a principal diferença é que YAML usa indentação enquanto JSON usa parêntesis . Isto torna YAML mais conciso e legível (para a olho treinado).
Qual escolher?- YAML as funcionalidades extra e a notação concisa fazem com que seja uma boa escolha para os ficheiros de configuração (ficheiros não fornecidos pelo utilizador).
- JSON recursos limitados, suporte amplo e processamento mais rápido torna-o uma grande escolha para a interoperabilidade e o utilizador forneceu dados.
Uma vez que esta questão agora aparece proeminentemente quando se procura YAML e JSON, vale a pena notar uma diferença raramente citada entre as duas: licença. JSON pretende ter uma licença a qual os usuários de JSON devem aderir (incluindo o legalmente Ambíguo "deve ser usado para o bem, não para o mal"). A YAML não possui tal licença, e isso pode ser uma diferença importante (para o seu advogado, se não para você).
In Go, for example, you can have both at the same time:
type Person struct {
Name string `json:"name" yaml:"name"`
Age int `json:"age" yaml:"age"`
}
No final, honestamente não questao. Ambos JSON e YAML são facilmente lidos por qualquer programador experiente.