Uma matriz pode ser texto JSON de nível superior?

Respostas:

126

Sim, uma matriz é válida como texto JSON de nível superior.

Existem três documentos padrão que definem JSON: RFC 4627 , RFC 7159 (que torna o RFC 4627 obsoleto) e ECMA-404 . Eles diferem em quais elementos de nível superior eles permitem, mas todos permitem um objeto ou uma matriz como o elemento de nível superior.

  • RFC 4627: Objeto ou matriz.
    "Um texto JSON é um objeto serializado ou matriz."
  • RFC 7159: qualquer valor JSON.
    "Um texto JSON é um valor serializado."
  • ECMA-404: Qualquer valor JSON.
    "Um texto JSON é uma sequência de tokens formados a partir de pontos de código Unicode que estão em conformidade com a gramática de valor JSON."
sleske
fonte
2
A partir deste RFC mais recente , "Um texto JSON é uma sequência de tokens. O conjunto de tokens inclui seis caracteres estruturais, strings, números e três nomes literais."
antak de
63

Sim , mas você deve considerar transformar a raiz em um objeto em alguns cenários, devido ao sequestro de JSON . Esta é uma vulnerabilidade de divulgação de informações baseada na substituição do construtor de array em JavaScript.

Matthew Flaschen
fonte
11
Sim, essa é a marca registrada de uma ótima resposta - não apenas dizer ao OP o que eles queriam saber, mas também o que deveriam saber (mas não perceberam). Na verdade, há um monte de vulnerabilidades associadas ao JSON que analisa como Javascript, o sequestro de JSON é apenas um exemplo.
sleske de
9
FWIW, o sequestro de JSON não é um problema para os navegadores modernos .
Franklin Yu
4

Isso é da especificação ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber
ChaosPandion
fonte
1
Isso é um pouco enganador, pois o ECMAScript permite que você analise strings JSON que não são textos de nível superior. De acordo com a RFC, "Um texto JSON é um objeto serializado ou matriz."
Matthew Flaschen
@Matthew - Estranho, gostaria de saber como Crockford se sente sobre isso. Como eles vão reconciliar as diferenças entre o RFC e o ECMA?
ChaosPandion
3
Eu apenas olhei e descobri que eles estão cientes da diferença. De ECMAScript 5 §15.12, "A produção JSONText de nível superior da gramática JSON ECMAScript pode consistir em qualquer JSONValue em vez de ser restrito a ser um JSONObject ou um JSONArray conforme especificado pela RFC 4627." Não sei se o IETF vai mudar o RFC.
Matthew Flaschen
@Matthew - Obrigado por isso, eu estava ficando terrivelmente confuso. A descrição json.org não menciona o conceito mais restritivo de "json-texto" em tudo , e tipo de vaga sobre o seu significado da RFC.
março de
Esta resposta é sobre ECMAScript, mas a pergunta é sobre JSON. Embora (deliberadamente) pareçam semelhantes, são especificações diferentes .
sleske,
2

sim, experimente aqui.

http://www.jsonlint.com/

e coloque em [{}]

hvgotcodes
fonte
3
É ainda mais fácil do que isso. Coloque []e ele irá validar.
sorpigal
O link está morto, atualize ou remova esta resposta - quase apenas um link.
Anthon de
1

Há alguma confusão, vista nos outros comentários. O tipo de mídia "aplicativo / json" permite apenas objeto ou matriz no nível superior para texto JSON , por JSON RFC . No entanto, para um analisador, qualquer valor JSON é aceitável, conforme visto na especificação ECMAScript.

cdunn2001
fonte
Qualquer valor JSON como o elemento de nível superior é aceitável para um analisador ECMAScript , mas não para um analisador JSON (compatível) - distinção importante.
sleske,
É uma distinção interessante, mas não entendo o que você está dizendo. Qual é a definição de um "analisador JSON (compatível)"?
cdunn2001
1
Bem, um analisador JSON é um analisador para a gramática JSON. Embora JSON seja semelhante a Javascript, é uma gramática diferente (muito mais simples). Consulte tools.ietf.org/html/rfc7159 , que descreve a gramática JSON. "compatível" significa apenas que o analisador realmente segue a gramática (o que qualquer analisador decente deveria).
sleske,
3
RFC 4627 está desatualizado, por favor, não siga mais. O novo RFC permite também valores simples no nível superior.
Matthias Dieter Wallnöfer