Qual é a diferença entre YAML e JSON? Quando preferir um ao outro

Quando devemos preferir usar YAML em vez de JSON e vice-versa, considerando as seguintes coisas?

  • Desempenho (codificar/descodificar o tempo)
  • consumo de memória
  • expressão clareza
  • disponibilidade da Biblioteca, facilidade de Utilização (Prefiro C)
Estava a planear usar um destes dois no nosso sistema incorporado para armazenar ficheiros de configuração.

relacionado:

devo usar o YAML ou o JSON para guardar os meus dados Perl?

 521
Author: Community, 2009-11-13

11 answers

Tecnicamente o YAML é um super-conjunto do JSON. Isto significa que, em teoria, pelo menos, um analisador YAML pode entender JSON, mas não necessariamente o contrário.

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.
Na prática, nenhum destes dois últimos pontos irá importar para as coisas que nós fazemos, mas a longo prazo, acho que ... A YAML será um formato de serialização de dados mais robusto e viável. Neste momento, o AJAX e outras tecnologias da web tendem a usar o JSON. O YAML está atualmente sendo usado mais para processos de dados offline. Por exemplo, ele é incluído por padrão no OpenCV computer vision pacote baseado em C, enquanto JSON não é. Vão encontrar bibliotecas C para o JSON e o YAML. As bibliotecas do YAML tendem a ser mais recentes, mas não tive problemas com elas no passado. Veja por exemplo Yaml-cpp .
 518
Author: AndyL, 2017-07-13 19:59:31

Diferenças:

  1. YAML, dependendo de como você o usa, pode ser mais legível do que JSON
  2. o JSON é frequentemente mais rápidoe provavelmente ainda é interoperável com mais sistemas
  3. É possível escrever um" bom o suficiente " json parser muito rapidamente.
  4. chaves duplicadas, que são potencialmente JSON válido, são definitivamente YAML inválido.
  5. 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.
  6. é 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).
  7. 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.
  8. em alguns ambientes de codificação, o uso de YAML pode permitir um atacante para executar código arbitrário .

Observações:

  1. 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.
  2. muitos programadores consideram o apego do "significado" à indentação uma má escolha.
  3. 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.
  4. YAML pode ser usado, diretamente, para tarefas complexas como definições gramaticais, e muitas vezes é uma escolha melhor do que inventar uma nova linguagem.
 130
Author: Erik Aronesty, 2018-07-20 18:53:10
Ignorando a teoria esotérica

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.

  1. o YAML usa indentação de espaços em branco, que é um território familiar para os programadores Python.
  2. 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.
  3. Há uma infinidade de parsers que funcionam muito bem em todas as línguas, tanto para a YAML como para a JSON.
  4. 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.
  5. 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.
  6. 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.
  7. 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.

 57
Author: Jason Sebring, 2018-01-16 19:07:31
[[3] esta pergunta tem 6 anos, mas estranhamente, nenhuma das respostas realmente aborda todos os quatro pontos (velocidade, memória, expressividade, portabilidade).

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.

 23
Author: Steve Bennett, 2017-10-31 03:44:16

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?
 20
Author: jldupont, 2009-11-13 02:46:45

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.

 17
Author: , 2009-11-13 02:50:50

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.
 11
Author: JohnAD, 2018-03-23 19:41:20

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.
 8
Author: Wernight, 2016-03-03 13:42:34

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ê).

 3
Author: Mvr39, 2016-09-20 07:18:59
Às vezes, não temos de decidir por um em vez do outro.

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"`
}
 2
Author: Michael Dorner, 2017-12-07 08:00:22
Acho o YAML e o JSON muito eficazes. As duas únicas coisas que realmente ditam quando uma é usada sobre a outra para mim é uma, com o que a linguagem é usada mais popularmente. Por exemplo, se eu estiver usando Java, Javascript, eu vou usar JSON. Para Java, eu vou usar seus próprios objetos, que são muito JSON, mas faltando em algumas características, e convertê-lo para JSON se eu precisar ou torná-lo em JSON em primeiro lugar. Eu faço isso porque isso é uma coisa comum em Java e torna mais fácil para outros desenvolvedores Java para modificar meu código. A segunda coisa é se eu estou usando-o para o programa de lembrar atributos, ou se o programa está a receber instruções, na forma de um arquivo de configuração, neste caso eu vou usar YAML, porque é muito facilmente humanos de leitura, tem boa aparência sintaxe, e é muito fácil de modificar, mesmo se você não tem idéia de como YAML obras. Então, o programa vai lê-lo e convertê-lo para JSON, ou o que for preferido para essa linguagem.

No final, honestamente não questao. Ambos JSON e YAML são facilmente lidos por qualquer programador experiente.
 0
Author: Triforcey, 2016-12-06 00:52:30