JavaScript Object Notation
| JavaScript Object Notation | |
|---|---|
|
| |
| Extensão do arquivo : |
.json
|
| Tipo MIME : | application / json |
| Padrão (s) : | RFC 8259 , ECMA-404 (PDF) |
| Site : | https://json.org/ |
O JavaScript Object Notation ( JSON [ ˈdʒeɪsən ]) é um formato de dados compacto em um formato de texto fácil de ler para troca de dados entre aplicativos. JSON é independente da linguagem de programação. Analisadores e geradores existem em todas as linguagens comuns.
JSON foi originalmente especificado por Douglas Crockford . Atualmente (no final de 2017) ele é especificado por dois padrões diferentes, mas com o mesmo conteúdo - RFC 8259 e ECMA-404.
Areas de aplicação
JSON é usado para transferir e armazenar dados estruturados. Ele serve como formato de dados para transmissão de dados ( serialização ). Em aplicativos da web e aplicativos móveis em particular , é frequentemente usado em conjunto com JavaScript , Ajax ou WebSockets para transferir dados entre o cliente e o servidor.
Estrutura de dados e definição de formato
Codificação de caracteres e tipos de dados
Os dados podem ser aninhados conforme necessário, por exemplo, uma lista indexada ("array") de objetos é possível, que por sua vez contém arrays ou objetos. Por padrão, JSON usa UTF-8 como codificação de caracteres . Além disso, UTF-16 e UTF-32 são possíveis.
JSON conhece os seguintes tipos de elementos .
- Valor zero
- é representado pela palavra-chave
null. - Valor booleano
- é representado pelas palavras
true- chave efalse. Não são cordas. Eles irão gostarnull, não entre aspas. - número
- é uma sequência de dígitos
0-9. Esta sequência pode ser iniciada por um sinal negativo-e interrompida por uma casa decimal.. O número pode ser complementado especificando um expoenteeouE, que é seguido por um sinal opcional+ou-e uma sequência de dígitos0-9. - Fragmento
- começa e termina com aspas retas duplas (
"). Ele pode conter caracteres Unicode e sequências de escape\iniciadas . - Variedade
- começa com
[e termina com]. Ele contém uma lista indexada, dividida por vírgulas, de elementos do mesmo tipo ou de tipos diferentes. Matrizes vazias são permitidas.
- objeto
- começa com
{e termina com}. Ele contém uma lista não ordenada de propriedades, separadas por vírgulas . Objetos sem propriedades ("objetos vazios") são permitidos.- característica
- consiste em uma chave e um valor, separados por dois pontos (
Schlüssel : Wert). As chaves devem ser exclusivas, já que diferentes analisadores lidam com chaves duplicadas de maneira diferente. Embora o ECMA-404 não exija exclusividade, o RFC 7159 exige que as chaves sejam exclusivas dentro de um objeto.- a chave é uma string .
- o valor é qualquer elemento .
Podem ser usados caracteres de espaço em branco insignificantes .
limitações
JSON não oferece suporte a todos os tipos de dados compatíveis com JavaScript. No caso de tipos de dados não suportados, a serialização é realizada da seguinte forma:
-
NaN,Infinitye-Infinitysãonullserializados para. -
Date-Os objetos são convertidos em uma sequência de caracteres que está em conformidade com uma descrição de formato de data de acordo com ISO-8601 . -
Function-,RegExp- eError-objetos são descartados.
exemplo
{
"Herausgeber": "Xema",
"Nummer": "1234-5678-9012-3456",
"Deckung": 2e+6,
"Waehrung": "EURO",
"Inhaber":
{
"Name": "Mustermann",
"Vorname": "Max",
"maennlich": true,
"Hobbys": ["Reiten", "Golfen", "Lesen"],
"Alter": 42,
"Kinder": [],
"Partner": null
}
}
Esquema JSON
O esquema JSON especifica um formato baseado em JSON para definir a estrutura dos dados JSON para validação , documentação e controle de interação. Ele contém um contrato para os dados JSON necessários para um determinado aplicativo e como esses dados podem ser modificados.
O esquema JSON é baseado nos conceitos do esquema XML , mas é baseado em JSON. Como no XSD, os mesmos programas de serialização e desserialização podem ser usados para o esquema e os dados. É autodescritivo e descrito em um rascunho da Internet pela Força-Tarefa de Engenharia da Internet . Vários validadores , cada um com diferentes níveis de conformidade, estão disponíveis para diferentes linguagens de programação .
exemplo
{
"$schema": "http://json-schema.org/draft/2019-09/schema",
"title": "Politiker",
"type": "object",
"required": ["Vorname", "Nachname", "Geburtsdatum", "Nationalitaet"],
"properties":
{
"Vorname":
{
"type": "string"
},
"Nachname":
{
"type": "string"
},
"Geburtsdatum":
{
"type": "date"
},
"Nationalitaet":
{
"type": "string"
},
"Partei":
{
"type": "object",
"properties":
{
"Name":
{
"type": "string"
},
"Hauptsitz":
{
"type": "string"
},
"Gründungsdatum":
{
"type": "date"
},
"Gründungsort":
{
"type": "string"
}
}
},
"Amt":
{
"type": "string"
}
}
}
O esquema JSON acima pode ser usado para testar a validade do seguinte bloco de dados:
{
"Vorname": "Ronald",
"Nachname": "Reagan",
"Geburtsdatum": "1911-02-06",
"Nationalitaet": "US-amerikanisch",
"Partei":
{
"Name": "Republican Party",
"Hauptsitz": "Washington, D.C.",
"Gründungsdatum": "1854-03-20",
"Gründungsort": "Ripon"
},
"Amt": "US-Präsident"
}
Comparação com XML
JSON e XML descrevem a estrutura de um registro de dados. O registro de dados pode conter outros registros de dados, o que significa que as estruturas podem ser aninhadas com a profundidade desejada.
Os nós individuais da estrutura de dados são nomeados em XML, enquanto os nós não são nomeados em JSON.
Em XML, cadeias de caracteres simples podem ser descritas como um atributo de um elemento e como um elemento separado; em JSON, não há essa distinção. Essa flexibilidade, que é irrelevante na maioria dos casos, significa que a estrutura dos documentos XML muitas vezes difere desnecessariamente.
Existem linguagens de descrição para JSON e XML para limitar ainda mais a aparência de documentos “válidos”, em oposição a documentos “bem formados”.
A sintaxe do JSON é muito mais simples e, portanto, muitas vezes parece mais legível e, em particular, mais fácil de escrever. Normalmente, JSON também produz menos sobrecarga em comparação com XML.
Ambos JSON e XML devem ser lidos por um analisador especial. Tradicionalmente, todo documento JSON bem formado é uma expressão JavaScript válida, mas interpretar descuidadamente documentos JSON com eval leva a falhas de segurança .
JSON e XML não são adequados para representar dados binários porque ambos os formatos de dados são baseados em caracteres como primitivos, em vez de baseados em bytes.
Para comparação, o exemplo acima em um formato XML:
<Kreditkarte Herausgeber="Xema" Nummer="1234-5678-9012-3456" Deckung="2e+6" Waehrung="EURO">
<Inhaber Name="Mustermann" Vorname="Max" maennlich="true" Alter="42" Partner="null">
<Hobbys>
<Hobby>Reiten</Hobby>
<Hobby>Golfen</Hobby>
<Hobby>Lesen</Hobby>
</Hobbys>
<Kinder />
</Inhaber>
</Kreditkarte>
Depois de remover os espaços opcionais, o objeto JSON tem 226 bytes e o objeto XML 279 bytes - um aumento de 23%. Freqüentemente, os atributos também podem ser formulados como nós filhos, o exemplo poderia ser assim:
<Kreditkarte>
<Herausgeber>Xema</Herausgeber>
<Nummer>1234-5678-9012-3456</Nummer>
<Deckung>2e+6</Deckung>
<Waehrung>EURO</Waehrung>
<Inhaber>
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<maennlich>true</maennlich>
<Hobbys>
<Hobby>Reiten</Hobby>
<Hobby>Golfen</Hobby>
<Hobby>Lesen</Hobby>
</Hobbys>
<Alter>42</Alter>
<Kinder />
<Partner>null</Partner>
</Inhaber>
</Kreditkarte>
Se os espaços em branco fossem removidos, esse objeto teria 361 bytes de tamanho - um aumento de 60% em relação ao objeto JSON.
JSONP (JSON com preenchimento)
| JSONP (JSON com preenchimento) | |
|---|---|
| |
| Extensão do arquivo : |
.jsonp
|
| Tipo MIME : | aplicativo / json-p |
| Padrão (s) : | RFC 7159 , RFC 4329 |
| Site : | json-p.org |
Com JSONP (JSON com preenchimento), os dados JSON são integrados por meio de um <script>elemento e saída, incluindo uma chamada de função. Isso permite a transferência de dados JSON através dos limites do domínio , mas está repleto de riscos de segurança.
JSONP foi introduzido por Bob Ippolito em 2005 e agora é suportado por muitos aplicativos da Web 2.0, como Dojo Toolkit , jQuery , Google Web Toolkit Applications e Web Services. Extensões foram propostas para este protocolo que permitem parâmetros de entrada adicionais, como B. JSONPP.
funcionalidade
As consultas de dados Ajax para servidores geralmente são feitas por meio do objeto XMLHttpRequest de um navegador da web . Devido à política de mesma origem , isso não funciona se o site exibido em um navegador da web tentar usar este objeto para acessar um servidor que está localizado em um domínio diferente do site exibido. O problema pode ser contornado usando JSONP. No srcatributo de um <script>elemento é possível especificar qualquer URL. A política de mesma origem não se aplica a este atributo. Portanto, é possível especificar uma URL em outro domínio que retorna dados JSON, por exemplo. Mas esse script não teria efeito.
Para poder processar os dados JSON no cliente , o servidor os empacota como parâmetros em uma função JavaScript que já está definida no navegador da web. O nome dessa função geralmente é comunicado ao servidor na string de consulta da URL, embora o formato exato ou o nome do parâmetro não seja padronizado.
Exemplo:
Os dados JSONP são integrados ao código HTML de um site da seguinte forma:
<script type="text/javascript"
src="https://example.com/getjson?jsonp=exampleCallback">
</script>
O servidor então gera um snippet de código JavaScript no qual os dados reais são transferidos para a função mencionada:
exampleCallback( {"name":"Jane Doe", "value":4711} );
O navegador então executa essa chamada de função como se ela tivesse sido escrita diretamente na página HTML e pode, assim, processar os dados JSON da chamada.
Normalmente, um <script>elemento separado é necessário para cada chamada JSONP .
Riscos de segurança
<script>Os elementos permitem que um servidor transmita qualquer conteúdo (não apenas objetos JSON) para o navegador da web. Isso pode levar a um serviço da web mal-intencionado espionando informações privadas no navegador da web por meio dos dados enviados de volta ou alterando-os em seu sentido ( script entre sites ).
Como o <script>elemento não segue a política de mesma origem , um site malicioso pode solicitar e avaliar dados JSONP que não se destinam a ele ( Cross-Site-Request-Forgery ). O problema surge quando dados confidenciais precisam ser protegidos de terceiros.
alternativa
Com o Compartilhamento de recursos de origem cruzada (CORS), há um método comparável que permite o acesso através dos limites do domínio, mas sem dar ao recurso solicitado a opção de executar qualquer código JavaScript. Ambos os métodos requerem o suporte do recurso apropriado, sendo o CORS mais fácil de implementar. Ao mesmo tempo, o CORS permite que o recurso restrinja facilmente as fontes de dados (origens, URLs, domínios, etc.) a partir das quais ele pode ser usado.
O CORS é geralmente preferível ao JSONP porque o CORS é mais simples e mais seguro em geral.
Extensões JSON
JSON-LD é usado para incorporar dados RDF .
O Hypertext Application Language (HAL) é usado para implementar HATEOAS em interfaces REST baseadas em JSON .
JSON Hyper-Schema é usado para anotar tipos de dados em JSON.
Streaming JSON com as três variantes JSON delimitado por linha (LDJSON), JSON delimitado por nova linha (NDJSON) e linhas JSON (JSONL).
GBSON é usado para anotar sequências de ácido nucléico ( DNA e RNA ).
Técnicas semelhantes
Hjson oferece uma sintaxe alternativa que é mais flexível e, portanto, simplifica a criação por humanos. No entanto, devido à velocidade de processamento mais lenta, é recomendável usá-lo apenas para arquivos de configuração.
YAML é um formato de dados semelhante, mas muito mais complicado. YAML 1.2 pode ser visto como um superconjunto de JSON, já que cada documento JSON também pode ser representado como um documento YAML.
Variantes binárias de JSON estão disponíveis com BSON (Binary JSON), usado entre outras coisas. pelo MongoDB e com JSONB usado pelo PostgreSQL . Os buffers de protocolo do Google (protobuf) seguem uma abordagem semelhante , que, em contraste com JSON ou BSON, são baseados em um esquema. Também baseado em JSON está o CBOR sem esquema, que é otimizado para serialização com economia de espaço e velocidade de processamento .
O NeXTstep e o macOS usam uma técnica semelhante para carregar ou salvar árvores de objetos simples. Eles são chamados de listas de propriedades aqui . Eles também permitem o armazenamento de valores dos tipos array , dicionário , valor booleano, dados binários, data, número e cadeias de caracteres. Eles são codificados como XML, formato binário compacto ou ASCII ou UTF-8.
A Tool Command Language conhece dicionários (dict), que também podem conter quaisquer estruturas aninhadas nomeadas. Essas também são strings estruturadas. O esforço adicional ("sobrecarga" do inglês) é significativamente reduzido em comparação com JSON porque não são necessários dois-pontos ou aspas. No entanto, não há uma separação clara entre estruturas de objetos (propriedade / valor) e tabelas ("matrizes", aqui chamadas de listas). Portanto, uma transferência de dados JSON para um dicionário é sempre clara e facilmente possível, mas não o contrário.
Veja também
- Gson é uma biblioteca Java que converte objetos Java em JSON
- Arquivo de configuração # formatos de arquivo
Outra alternativa ao JSON é o formato de dados Simple Markup Language (SML). Como o JSON, ele oferece opções de minificação para atingir tamanhos de arquivo pequenos e também comentários que o JSON não possui por padrão.
Links da web
- json.org/json-de.html - introdução em alemão na página oficial JSON (outros idiomas disponíveis)
- Acelerando AJAX com JSON Introdução ao JSON, em que as diferenças para XML são resolvidas (inglês)
- Analisar JSON é um campo minado - Visão geral dos diferentes padrões e implementações
- JSON Viewer plataforma online para formatar, validar e trocar dados JSON
- jsonp.eu - Explicações e exemplos de programação para JSON com Padding (JSONP)
Evidência individual
- ^ Douglas Crockford: O formato de intercâmbio de dados do JavaScript Object Notation (JSON) . 2017 (inglês, online [PDF; acessado em 5 de janeiro de 2017]).
- ↑ ECMA International (Ed.): O JSON Data Interchange Format . 2013 (inglês, online [PDF; acessado em 22 de abril de 2014]).
- ↑ RFC 4627 - O tipo de mídia application / json para JavaScript Object Notation (JSON) . Julho de 2006. Seção 2: Gramática JSON. (Inglês).
- ↑ esquema JSON
- ↑ arquivo da web ( Memento de 4 de março de 2016 no Internet Archive )
- ↑ JSON remoto - JSONP . In: from __future__ import * . Bob.pythonmac.org. 5 de dezembro de 2005. Recuperado em 23 de janeiro de 2011.
- ↑ API jQuery . Recuperado em 23 de janeiro de 2011.
- ↑ Tutorial GWT: Como ler Web Services Client-Side com JSONP . In: Aplicativos do Google Web Toolkit . 6 de fevereiro de 2008. Arquivado do original em 17 de janeiro de 2013. Recuperado em 23 de janeiro de 2011.
- ↑ Jonas Almeida: JSON, JSONP, JSONPP? . S3DB. 11 de junho de 2008. Recuperado em 23 de janeiro de 2011.
- ^ Jeremiah Grossman: Técnicas avançadas de ataque da Web usando o GMail . 27 de janeiro de 2006. Recuperado em 23 de janeiro de 2011.
- ^ Mike Kelly: JSON Hypertext Application Language. Grupo de Trabalho da Rede IETF , 12 de outubro de 2016, acessado em 7 de dezembro de 2016 .
- ↑ Austin Wright, Geraint Luff: JSON Hyper-Schema: A Vocabulary for Hypermedia Annotation of JSON. IETF , 13 de agosto de 2016, acessado em 7 de dezembro de 2016 .
- ↑ GBSON. Um novo formato de arquivo de anotação baseado em JSON. Acessado em 24 de novembro de 2019 .
- ↑ YAML Ain't Markup Language (YAML ™) Versão 1.2
- ↑ bsonspec.org
- ↑ Documentação do PostgreSQL 12, 8.14. Tipos JSON
- ^ O que são buffers de protocolo?
- ↑ Buffers de protocolo - formato de intercâmbio de dados do Google
- ↑ CBOR - Representação Concisa de Objetos Binários | Visão geral. Recuperado em 16 de fevereiro de 2019 .
- ↑ Introdução às listas de propriedades. Em: developer.apple.com. Recuperado em 6 de novembro de 2011 .
