Alguém pode me dizer qual é a principal diferença entre um objeto JavaScript definido usando o Object Literal Notation e o objeto JSON ?
De acordo com um livro JavaScript, ele diz que este é um objeto definido usando a Notação de Objeto :
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
Por que não é um objeto JSON neste caso? Só porque não é definido usando aspas?
javascript
json
object-notation
pencilCake
fonte
fonte
Respostas:
Vamos esclarecer primeiro o que realmente é o JSON . JSON é um formato textual de troca de dados, independente de idioma, como XML, CSV ou YAML.
Os dados podem ser armazenados de várias maneiras, mas se devem ser armazenados em um arquivo de texto e legíveis por um computador, é necessário seguir alguma estrutura. JSON é um dos muitos formatos que definem essa estrutura.
Esses formatos geralmente são independentes da linguagem, o que significa que podem ser processados por Java, Python, JavaScript, PHP, etc.
Por outro lado, o JavaScript é uma linguagem de programação. É claro que o JavaScript também fornece uma maneira de definir / descrever dados, mas a sintaxe é muito específica para o JavaScript.
Como um exemplo contrário, o Python tem o conceito de tuplas , sua sintaxe é
(x, y)
. JavaScript não tem algo parecido com isto.Vamos examinar as diferenças sintáticas entre literais de objetos JSON e JavaScript.
JSON tem as seguintes restrições sintáticas:
"
).true
false
null
{"foo":"bar","foo":"baz"}
) produzem resultados indefinidos e específicos da implementação; a especificação JSON especificamente não define sua semânticaEm JavaScript, literais de objetos podem ter
undefined
.Sabendo que, apenas olhando a sintaxe , seu exemplo não é JSON por dois motivos:
Mas o mais importante, para repetir minha explicação desde o início: você está em um contexto JavaScript. Você define um objeto JavaScript. Se houver, um "objeto JSON" só pode estar contido em uma sequência:
Ou seja, se você estiver escrevendo o código-fonte JavaScript e não lidando com uma sequência , não está lidando com o JSON. Talvez você tenha recebido os dados como JSON (por exemplo, via ajax ou lendo um arquivo), mas depois que você ou uma biblioteca que você está usando o analisou, ele não é mais JSON.
Somente como literais de objeto e JSON parecem semelhantes , isso não significa que você pode nomeá-los de forma intercambiável. Consulte também Não existe um "objeto JSON" .
fonte
JSON tem uma sintaxe muito mais limitada, incluindo:
"
e não'
fonte
Realmente não existe um "objeto JSON".
A especificação JSON é uma sintaxe para codificar dados como uma sequência. O que as pessoas chamam de "Objeto JSON" (em javascript) é realmente apenas um objeto javascript comum que (provavelmente) foi desserializado de uma sequência JSON válida e pode ser facilmente re-serializado como uma sequência JSON válida. Isso geralmente significa que ele contém apenas dados (e não funções). Isso também significa que não há datas, porque o JSON não possui um tipo de data (provavelmente a coisa mais dolorosa sobre o JSON;)
Além disso, quando as pessoas falam sobre um "Objeto JSON", elas quase sempre significam dados que possuem "chaves" no nível superior. Isso corresponde muito bem a um objeto javascript. No entanto, a especificação JSON não exige que haja um único objeto "chaves" no nível superior de uma sequência JSON. É perfeitamente válido o JSON ter uma lista no nível superior ou até ter apenas um único valor. Portanto, enquanto todo "Objeto JSON" corresponde a JSON válido, nem todas as sequências JSON válidas correspondem ao que chamaríamos de "Objeto JSON"! (porque a sequência pode representar uma lista ou um valor atômico)
fonte
JSON-text = object / array
.De acordo com o JSON em JavaScript ,
Em outras palavras, JSON válido também é uma notação literal de objeto JavaScript válida, mas não necessariamente o contrário.
Além de ler a documentação , como o @Filix King sugeriu, também sugiro brincar com o validador JSON on-line JSONLint . Foi assim que aprendi que as chaves dos objetos JSON devem ser cadeias de caracteres.
fonte
🔫 JSON : a alternativa sem gordura ao XML
O JSON foi amplamente adotado por pessoas que descobriram que tornava muito mais fácil produzir aplicativos e serviços distribuídos. O tipo de mídia oficial da Internet para JSON é
application/json
RFC 4627
. Nomes de arquivos JSON usar a extensão.json
.► JavaScript Object Notation (
JSON
) é um formato de intercâmbio de dados leve, baseado em texto e independente de idioma. JSON foi usado para trocar dados entre aplicativos escritos em qualquer linguagem de programação.JSON é um subconjunto de JavaScript. O Javascript foi derivado do ECMAScript Programming Language Standard.
► ECMAScript
O ECMAScript cresceu e se tornou uma das linguagens de programação de uso geral mais usadas no mundo. É mais conhecido como o idioma incorporado nos navegadores da Web, mas também foi amplamente adotado para servidores e aplicativos incorporados. O ECMAScript é baseado em várias tecnologias originárias, sendo as mais conhecidas
JavaScript
(Netscape Communications) eJScript
(Microsoft Corporation).) . Embora antes de 1994, a ECMA fosse conhecida como "Associação Europeia de Fabricantes de Computadores", depois de 1994, quando a organização se tornou global, a "marca" "Ecma" foi mantida por razões históricas.ECMAScript é a linguagem, enquanto JavaScript, JScript e até ActionScript são chamados
"Dialects"
.Informações sobre o navegador e o computador de seus usuários.
ECMAScript é a linguagem de script que forma a base do JavaScript. .
JavaScript
language resources
ECMA-262
Links
Initial Edition, June 1997
PDF.
2nd Edition, August 1998
PDF.
3rd Edition, December 1999
PDF.
5th Edition, December 2009
PDF.
5.1 Edition, June 2011
HTML.
6th Edition, June 2015
HTML.
7ᵗʰ Edition, June 2016
HTML.
8th edition, June 2017
HTML.
9th Edition, 2018
HTML.
NOTA « 4ª edição do ECMAScript não publicada porque o trabalho estava incompleto .
► Os valores das chaves devem ser citados, apenas Strings são permitidas para chaves. Se você usar outro que não seja String, ele será convertido em String. Mas não é recomendável usar outras chaves além das de String. Veja um exemplo como este -
{ 'key':'val' }
acimaRFC 4627 - jsonformatter
► As strings JSON devem ser citadas com "e não". Uma string é muito parecida com uma string C ou Java. As strings devem ser colocadas entre aspas duplas.
Os acessadores de propriedade de objeto fornecem acesso às propriedades de um objeto usando a notação de ponto ou de colchete.
► Você tem uma faixa de valores mais limitada (por exemplo, nenhuma função é permitida). Um valor pode ser uma cadeia de caracteres entre aspas duplas, número, booleano, nulo, objeto ou matriz. Essas estruturas podem ser aninhadas.
►
JavaScript
é a implementação mais popular do padrão ECMAScript. Os principais recursos do Javascript são baseados no padrão ECMAScript, mas o Javascript também possui outros recursos adicionais que não estão nas especificações / padrão do ECMA. Todo navegador tem um intérprete de JavaScript.JavaScript é uma linguagem de tipo dinâmico. Isso significa que você não precisa especificar o tipo de dados de uma variável quando a declara, e os tipos de dados são convertidos automaticamente conforme necessário durante a execução do script.
Literals
:Object literals
RFC 7159
Uma estrutura de objeto é representada como um par de colchetes envolvendo zero ou mais pares de nome / valor (ou membros). Um nome é uma string. Um único dois pontos vem após cada nome, separando o nome do valor. Uma única vírgula separa um valor do seguinte nome. Os nomes dentro de um objeto devem ser únicos.
O ECMAScript suporta herança baseada em protótipo. Todo construtor tem um protótipo associado e todo objeto criado por esse construtor tem uma referência implícita ao protótipo (chamado protótipo do objeto) associado ao seu construtor. Além disso, um protótipo pode ter uma referência implícita não nula ao seu protótipo, e assim por diante; isso é chamado de cadeia de protótipo.
Em uma linguagem orientada a objetos baseada em classe, em geral, o estado é carregado por instâncias, os métodos são carregados por classes e a herança é apenas de estrutura e comportamento. No ECMAScript, o estado e os métodos são transportados por objetos, e a estrutura, o comportamento e o estado são todos herdados.
Um protótipo é um objeto usado para implementar a herança de estrutura, estado e comportamento no ECMAScript. Quando um construtor cria um objeto, esse objeto faz referência implícita ao protótipo associado ao construtor com o objetivo de resolver as referências de propriedade. O protótipo associado ao construtor pode ser referenciado pela expressão do programa constructor.prototype, e as propriedades adicionadas ao protótipo de um objeto são compartilhadas, por herança, por todos os objetos que compartilham o protótipo.
fonte
Para aqueles que ainda pensam que a RFC é mais importante do que blogs e equívocos baseados em opiniões, vamos tentar esclarecer alguns pontos. Não vou repetir todas as diferenças corretas já mencionadas nas respostas anteriores, aqui só estou tentando agregar valor resumindo uma parte crucial rfc7159
Extratos de https://tools.ietf.org/html/rfc7159
Exemplos (da página 12 da RFC)
Este é um objeto JSON:
Seu membro Image é um objeto cujo membro Thumbnail é um objeto e cujo membro IDs é uma matriz de números.
Realmente?
fonte
Object
, é umString
. ObrigadoTanto quanto eu entendo, a principal diferença é a flexibilidade .
JSON é um tipo de invólucro na "JavaScript Object Notation" que força os usuários a obedecer regras mais estritas para definir os objetos. E isso é feito limitando as possíveis formas de declaração de objetos fornecidas pelo recurso JavaScript Object Notation.
Como resultado, temos objetos mais simples e padronizados que melhor se adaptam à troca de dados entre plataformas.
Então, basicamente, o newObject no meu exemplo acima é um objeto definido pelo JavaScript Objeect Notation; mas não é um objeto JSON 'válido' porque não segue as regras exigidas pelos padrões JSON.
Este link também é bastante útil: http://msdn.microsoft.com/en-us/library/bb299886.aspx
fonte
Primeiro você deve saber o que é JSON:
É um formato de intercâmbio de dados independente de idioma. A sintaxe do JSON foi inspirada na notação literal de objeto JavaScript, mas há diferenças entre eles.
Por exemplo, em JSON todas as chaves devem ser citadas, enquanto em literais de objeto isso não é necessário:
// JSON: {"foo": "bar"}
// literal do objeto: var o = {foo: "bar"}; As aspas são obrigatórias no JSON, porque no JavaScript (mais exatamente no ECMAScript 3rd. Edition), o uso de palavras reservadas como nomes de propriedades é proibido, por exemplo:
var o = {if: "foo"}; // SyntaxError no ES3 Enquanto, o uso de uma literal de cadeia de caracteres como um nome de propriedade (citando o nome da propriedade) não apresenta problemas:
var o = {"se": "foo"}; Portanto, para "compatibilidade" (e fácil avaliação, talvez?), As cotações são obrigatórias.
Os tipos de dados em JSON também são restritos aos seguintes valores:
string number objeto array Um literal como: true false null A gramática de Strings muda. Eles devem ser delimitados por aspas duplas, enquanto em JavaScript, você pode usar aspas simples ou duplas de forma intercambiável.
// JSON inválido: {"foo": 'bar'} A gramática JSON aceita de Numbers também muda, no JavaScript você pode usar literais hexadecimais, por exemplo 0xFF, ou (os infames) literais octais (por exemplo, 010). No JSON, você pode usar apenas literais decimais.
// JSON inválido: {"foo": 0xFF}
fonte
Objeto Javascript Literal vs JSON:
JSON
linguagem, que significa 'notação de objeto Javascript', tem sua sintaxe derivada da sintaxe literal do objeto javascript. É usado como um formato de transferência de dados textuais independente da linguagem de programação.Exemplo:
Notação de objeto JS, usada em JS para criar objetos no código convenientemente:
Exemplo de JSON:
Principais diferenças:
Todas as chaves de objeto no JSON devem ser cadeias. No Javascript, as chaves do objeto podem ser cadeias ou números
Todas as strings no JSON devem ser citadas entre "aspas duplas". Enquanto em Javascript são permitidas aspas simples e duplas. Mesmo sem aspas na notação de objeto Javascript, as chaves do objeto são convertidas implicitamente em cadeias.
No JSON, uma função não pode ser definida como um valor de um objeto (já que isso é específico do Javascript). Em Javascript, isso é completamente legal.
Construção de Javascript no
JSON
objeto:JSON
os objetos podem ser facilmente convertidos em Javascript e vice-versa usando oJSON
objeto incorporado que o Javascript oferece em seu tempo de execução. Por exemplo:fonte
Aqui está uma diferença surpreendente: você não pode usar
undefined
no json e todos os campos de objetos com valores indefinidos desaparecerão apósJSON.stringify
🙈🙉🙊
fonte