Un array può essere testo JSON di primo livello?


Risposte:


126

Sì, un array è legale come testo JSON di primo livello.

Esistono tre documenti standard che definiscono JSON: RFC 4627 , RFC 7159 (che rende obsoleto RFC 4627) ed ECMA-404 . Differiscono in quali elementi di primo livello consentono, ma tutti consentono un oggetto o un array come elemento di primo livello.

  • RFC 4627: oggetto o matrice.
    "Un testo JSON è un oggetto o un array serializzato."
  • RFC 7159: qualsiasi valore JSON.
    "Un testo JSON è un valore serializzato."
  • ECMA-404: qualsiasi valore JSON.
    "Un testo JSON è una sequenza di token formata da punti di codice Unicode che è conforme alla grammatica del valore JSON."

2
A partire da questa nuova RFC , "Un testo JSON è una sequenza di token. Il set di token include sei caratteri strutturali, stringhe, numeri e tre nomi letterali".
antak

63

, ma dovresti considerare di rendere la radice un oggetto invece in alcuni scenari, a causa del dirottamento JSON . Si tratta di una vulnerabilità di divulgazione di informazioni basata sull'override del costruttore di array in JavaScript.


11
Sì, questo è il segno distintivo di un'ottima risposta: non solo dire all'OP quello che volevano sapere, ma anche quello che avrebbero dovuto sapere (ma non si erano resi conto). In realtà, ci sono un sacco di vulnerabilità associate a JSON che analizza come Javascript, il dirottamento JSON è solo un esempio.
sleske

9
FWIW, il dirottamento JSON non è un problema per i browser moderni .
Franklin Yu

4

Questo è dalla specifica ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
Questo è un po 'fuorviante, tuttavia, perché ECMAScript ti consente di analizzare stringhe JSON che non sono testi di primo livello. Secondo la RFC, "Un testo JSON è un oggetto o un array serializzato".
Matthew Flaschen

@ Matthew - Strano, mi chiedo cosa ne pensi Crockford. Come conciliano le differenze tra RFC ed ECMA?
ChaosPandion

3
Ho appena guardato e ho scoperto che sono consapevoli della differenza. Da ECMAScript 5 §15.12, "La produzione di testo JSONText di primo livello della grammatica JSON ECMAScript può essere costituita da qualsiasi valore JSONValue anziché essere limitata a JSONObject o JSONArray come specificato da RFC 4627." Non so se IETF cambierà l'RFC.
Matthew Flaschen

@ Matthew - Grazie per questo, mi stavo terribilmente confuso. La descrizione json.org non menziona il concetto più restrittivo di "JSON-text" a tutti , e un po 'vago circa il suo significato della RFC.
mrec

Questa risposta riguarda ECMAScript, ma la domanda riguarda JSON. Anche se (deliberatamente) sembrano simili, hanno specifiche diverse .
sleske


1

C'è una certa confusione, vista negli altri commenti. Il tipo di supporto "application / json" consente solo oggetti o array al livello superiore per il testo JSON , per JSON RFC . Tuttavia, per un parser qualsiasi valore JSON è accettabile, come si vede nella specifica ECMAScript.


Qualsiasi valore JSON come elemento di primo livello è accettabile per un parser ECMAScript , ma non per un parser JSON (conforme) : distinzione importante.
sleske

È una distinzione interessante, ma non capisco cosa stai dicendo. Qual è la definizione di "parser JSON (conforme)"?
cdunn2001

1
Bene, un parser JSON è un parser per la grammatica JSON. Sebbene JSON sia simile a Javascript, è una grammatica diversa (molto più semplice). Vedi tools.ietf.org/html/rfc7159 , che descrive la grammatica JSON. "conforme" significa semplicemente che il parser segue effettivamente la grammatica (cosa che dovrebbe fare qualsiasi parser decente).
sleske

3
RFC 4627 non è aggiornato, per favore non seguirlo più. La nuova RFC consente anche valori semplici al livello superiore.
Matthias Dieter Wallnöfer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.