Li atentamente a descrição do JSON http://json.org/, mas não sei se sei a resposta para a pergunta simples. Quais cadeias de caracteres são o JSON válido mínimo possível?
"string"
a string é JSON válida?42
o número simples é válido JSON?true
o valor booleano é um JSON válido?{}
o objeto vazio é um JSON válido?[]
a matriz vazia é um JSON válido?
javascript
json
validation
bessarabov
fonte
fonte
Respostas:
No momento da redação deste artigo, o JSON era descrito apenas no RFC4627 . Ele descreve (no início de "2") um texto JSON como um objeto ou matriz serializada.
Isso significa que apenas
{}
e[]
são válidas, as strings JSON completas nos analisadores e stringifiers que aderem a esse padrão.No entanto , a introdução do ECMA-404 altera isso e os conselhos atualizados podem ser lidos aqui . Também escrevi um post sobre o assunto.
No entanto, para confundir ainda mais o assunto, o
JSON
objeto (por exemplo,JSON.parse()
eJSON.stringify()
) disponível nos navegadores da web é padronizado no ES5 , e isso define claramente os textos JSON aceitáveis da seguinte forma:Isso significa que todos os valores JSON (incluindo cadeias, valores nulos e números) são aceitos pelo objeto JSON, mesmo que o objeto JSON tecnicamente esteja em conformidade com o RFC 4627.
Observe que, portanto, você pode especificar um número em um navegador conforme
JSON.stringify(5)
, que seria rejeitado por outro analisador que adere à RFC4627, mas que não possui a exceção específica listada acima. Ruby, por exemplo, parece ser um exemplo que aceita apenas objetos e matrizes como raiz . Por outro lado, o PHP adiciona especificamente a exceção de que "ele também codifica e decodifica os tipos escalares e NULL".fonte
true
,false
ounull
por si só é um texto JSON válido? Você poderia citar uma fonte, pois isso contradiz a maioria das outras respostas / comentários aqui?Há pelo menos quatro documentos que podem ser considerados padrões JSON na Internet. Todos os RFCs mencionados descrevem o tipo MIME
application/json
. Aqui está o que cada um tem a dizer sobre os valores de nível superior e se algo além de um objeto ou matriz é permitido na parte superior:RFC-4627 : Não.
Observe que o RFC-4627 foi marcado como "informativo" em oposição ao "padrão proposto" e que é obsoleto pelo RFC-7159 , que por sua vez é obsoleto pelo RFC-8259.
RFC-8259 : Sim.
O RFC-8259 tem data de dezembro de 2017 e está marcado como "INTERNET STANDARD".
ECMA-262 : Sim.
ECMA-404 : Sim.
fonte
De acordo com a definição antiga na RFC 4627 (que foi obsoleta em março de 2014 pela RFC 7159), todos esses eram "valores JSON" válidos, mas apenas os dois últimos constituiriam um "texto JSON" completo:
Dependendo do analisador usado, os "valores JSON" únicos podem ser aceitos de qualquer maneira. Por exemplo (aderindo à terminologia "valor JSON" vs "texto JSON"):
JSON.parse()
função agora padronizada em navegadores modernos aceita qualquer "valor JSON"json_decode
foi introduzida na versão 5.2.0, aceitando apenas um "texto JSON" inteiro, mas foi alterada para aceitar qualquer "valor JSON" na versão 5.2.1json.loads
aceita qualquer "valor JSON" de acordo com exemplos nesta página de manualA distinção é um pouco como a distinção entre um "documento XML" e um "fragmento XML", embora tecnicamente
<foo />
seja um documento XML bem formado (seria melhor escrever como<?xml version="1.0" ?><foo />
, mas como indicado nos comentários, a<?xml
declaração é tecnicamente opcional )fonte
<foo />
é um documento XML bem formado , mas não é válido . (Mas o mesmo é verdade para<?xml version="1.0" ?><foo />
.)<foo />
pode ou não ser válido em um esquema específico , mas não é isso que esse padrão declara.A especificação ecma pode ser útil para referência:
http://www.ecma-international.org/ecma-262/5.1/
fonte
JSON.parse
função foi adicionada às versões posteriores do padrão ECMAScript com base na gramática de Crockford e na RFC.JSON.parse("\"string\"");
JSON significa JavaScript Object Notation. Somente
{}
e[]
defina um objeto Javascript. Os outros exemplos são literais de valor. Existem tipos de objeto em Javascript para trabalhar com esses valores, mas a expressão"string"
é uma representação do código-fonte de um valor literal e não de um objeto.Lembre-se de que JSON não é Javascript. É uma notação que representa dados. Possui uma estrutura muito simples e limitada. Os dados JSON são estruturados usando
{},:[]
caracteres. Você só pode usar valores literais dentro dessa estrutura.É perfeitamente válido que um servidor responda com uma descrição do objeto ou um valor literal. Todos os analisadores JSON devem ser manipulados para manipular apenas um valor literal, mas apenas um valor. JSON pode representar apenas um único objeto de cada vez. Portanto, para um servidor retornar mais de um valor, seria necessário estruturá-lo como um objeto ou uma matriz.
fonte
Sim, sim, sim, sim e sim. Todos eles são literais de valor JSON válidos.
No entanto, a RFC 4627 oficial declara:
Portanto, um "arquivo" inteiro deve consistir em um objeto ou matriz como a estrutura mais externa, que obviamente pode estar vazia. No entanto, muitos analisadores JSON também aceitam valores primitivos para entrada.
fonte
Portanto, sua resposta é
"{}"
qual denota um objeto vazio.fonte
undefined
, não "{}" `#Basta seguir os diagramas ferroviários fornecidos na página json.org . [] e {} são os objetos JSON válidos mínimos possíveis. Então a resposta é [] e {}.
fonte
array
eobject
você estaria certo, mas é razoável esperarvalue
que seja o começo.values
regra (ou além) das regrasarray
eobject
, os números e as cadeias independentes serão um documento JSON válido.[]
embora um texto JSON válido em todas as especificações que já teve uma opinião sobre o assunto, não seja um "objeto JSON válido", pois não é um objeto JSON. "Objeto" em JSON refere-se especificamente à{}
notação; Matrizes JSON não são objetos JSON.