Ricerca…


Osservazioni

JSON (JavaScript Object Notation) è uno dei formati di scambio dati più popolari e più ampiamente accettati originariamente specificato da Douglas Crockford.

Attualmente è descritto da due standard concorrenti, RFC 71592 ed ECMA-404 . Lo standard ECMA è minimo, descrivendo solo la sintassi grammaticale consentita, mentre la RFC fornisce anche alcune considerazioni semantiche e di sicurezza.

  • JSON è ampiamente accettato nei software che include l'architettura client-server per lo scambio di dati tra client e server.
  • JSON è un formato semplice da usare, basato su testo, leggero e leggibile dall'uomo e le persone spesso fraintendono come sostituto di XML.
  • Sebbene l'abbreviazione inizi con JavaScript, JSON non è una lingua o ha letterali linguistici è solo una specifica per la notazione dei dati.
  • È indipendente dalla piattaforma e dal linguaggio e supportato da quasi tutti i linguaggi / framework di prima linea e il supporto per il formato dati JSON è disponibile in tutti i linguaggi popolari, alcuni dei quali sono C #, PHP, Java, C ++, Python, Ruby e tanti altri.
  • Il tipo di supporto Internet ufficiale per JSON è application / json.
  • L'estensione del nome file JSON è .json.

Versioni

Poiché JSON non ha aggiornamenti, esiste solo una versione di JSON, il collegamento sottostante reindirizza al documento RFC originale, che è RFC 4627.

Versione Data di rilascio
Originale 2006-07-28

Regole di sintassi JSON

La sintassi JSON (notazione oggetti JavaScript) si basa su un sottoinsieme di JavaScript (vedere anche json.org ).

Un'espressione JSON valida può essere uno dei seguenti tipi di dati

  • tipi di dati semplici: String, Number, Boolean, Null
  • tipi di dati compositi: valore, oggetto, matrice

Tipi di dati semplici

Una stringa JSON deve essere racchiusa tra virgolette doppie e può contenere zero o più caratteri Unicode; le escape backslash sono consentite. I numeri JSON accettati sono in notazione E. Boolean è uno di true , false . Null è la parola chiave riservata null .

Tipo di dati Esempi di JSON validi
### Stringa "apple"
"苹果"
"\u00c4pfel\n"
""
### Numero 3
1.4
-1.5e3
### Booleano true
false
### Nullo null

Tipi di dati compositi

Valore

Un valore JSON può essere uno di: String, Number, Boolean, Null, Object, Array.

Oggetto

Un oggetto JSON è un insieme di nomi non separati da virgole: coppie di valori racchiuse tra parentesi graffe dove il nome è una stringa e valore di un valore JSON.

schieramento

Una matrice JSON è una raccolta ordinata di valori JSON.

Esempio di un array JSON:

["home", "wooden"]

Esempi di oggetti JSON:

{
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
}

[
  1,
  2,
  [3, 4, 5, 6],
  {
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
  }
]

Strumenti online per la convalida e la formattazione dei dati JSON:

Oggetto JSON

Un oggetto JSON è circondato da parentesi graffe e contiene coppie chiave-valore.

{ "key1": "value1", "key2": "value2", ... }

Le chiavi devono essere stringhe valide, quindi circondate da virgolette doppie. I valori possono essere oggetti JSON, numeri, stringhe, matrici o uno dei seguenti 'nomi letterali': false , null o true . In una coppia chiave-valore, la chiave è separata dal valore da due punti. Più coppie valore-chiave sono separate da virgole.

L'ordine negli oggetti non è importante. Il seguente oggetto JSON è quindi equivalente al precedente:

{ "key2": "value2", "key1": "value1", ... }

Per riassumere, questo è un esempio di un oggetto JSON valido:

{
  "image": {
    "width":  800,
    "height": 600,
    "title":  "View from 15th Floor",
    "thumbnail": {
      "url": "http://www.example.com/image/481989943",
      "height": 125,
      "width":  100
    },
    "visible": true,
    "ids": [116, 943, 234, 38793]
  }
}

Esempi comuni di oggetti JSON, con relative controparti oggetto (Java)

In questo esempio si presuppone che l'oggetto "root" che viene serializzato su JSON sia un'istanza della seguente classe:

public class MyJson {
}

Esempio 1: un esempio di un'istanza di MyJson , così com'è:

{}

cioè poiché la classe non ha campi, solo le parentesi graffe sono serializzate. Le parentesi graffe sono i delimitatori comuni per rappresentare un oggetto . Si noti anche come l'oggetto radice non sia serializzato come coppia chiave-valore. Questo vale anche per i tipi semplici (stringa, numeri, matrici) quando non sono campi di un oggetto (esterno).

Esempio 2: aggiungiamo alcuni campi a MyJson e inizializzali con alcuni valori:

// another class, useful to show how objects are serialized when inside other objects
public class MyOtherJson {} 

// an enriched version of our test class
public class MyJson {
  String myString = "my string";
  int myInt = 5;
  double[] myArrayOfDoubles = new double[] { 3.14, 2.72 };
  MyOtherJson objectInObject = new MyOtherJson();    
}

Questa è la relativa rappresentazione JSON:

{
  "myString" : "my string",
  "myInt" : 5,
  "myArrayOfDoubles" : [ 3.14, 2.72 ],
  "objectInObject" : {}
}

Si noti come tutti i campi sono serializzati in una struttura valore-chiave, dove la chiave è il nome del campo che contiene il valore. I delimitatori comuni per gli array sono parentesi quadre. Si noti inoltre che ciascuna coppia chiave-valore è seguita da una virgola, ad eccezione dell'ultima coppia.

JSON Array

Una matrice JSON è una raccolta di valori ordinata. È circondato da parentesi quadre [] e i valori sono separati da virgole:

{ "colors" : [ "red", "green", "blue" ] }

Gli array JSON possono anche contenere qualsiasi elemento JSON valido, inclusi gli oggetti, come in questo esempio di un array con 2 oggetti (presi dal documento RFC):

[
  {
     "precision": "zip",
     "Latitude":  37.7668,
     "Longitude": -122.3959,
     "Address":   "",
     "City":      "SAN FRANCISCO",
     "State":     "CA",
     "Zip":       "94107",
     "Country":   "US"
  },
  {
     "precision": "zip",
     "Latitude":  37.371991,
     "Longitude": -122.026020,
     "Address":   "",
     "City":      "SUNNYVALE",
     "State":     "CA",
     "Zip":       "94085",
     "Country":   "US"
  }
]

Possono anche contenere elementi con tipi misti, ad esempio:

[
    "red",
    51,
    true,
    null,
    {
        "state": "complete"
    }
]

Un errore comune durante la scrittura di matrici JSON (e oggetti) è di lasciare una virgola finale dopo l'ultimo elemento. Questo è uno schema comune in molte lingue, ma sfortunatamente non è valido in JSON. Ad esempio, il seguente array non è valido:

[
    1,
    2,
]

Per rendere questo valido, è necessario rimuovere la virgola dopo l'ultimo elemento, trasformandolo in:

[
    1,
    2
]

Modifica JSON a mano

JSON è un formato molto rigido (vedi http://json.org) . Ciò facilita l'analisi e la scrittura di macchine, ma sorprende gli esseri umani quando un errore poco appariscente rompe il documento.

Problemi comuni

Trailing virgola

A differenza della maggior parte dei linguaggi di programmazione, non è possibile aggiungere una virgola finale:

{
  a: 1,
  b: 2,
  c: 3
}

L'aggiunta di una virgola dopo 3 produrrà un errore synax.

Lo stesso problema esiste per gli array:

[ 
  1,
  2
]

È necessario prestare particolare attenzione se è necessario riordinare gli articoli.

Virgola mancante

{
  a: 1,
  b: 2,
  c: 3
  d: 4
}

Poiché le virgole non sono consentite, è facile dimenticare di aggiungerne una prima di aggiungere un nuovo valore (in questo caso dopo 3 ).

Commenti

JSON non consente commenti in quanto è un formato di interscambio dati. Questo è ancora un argomento scottante, anche se non ci sono risposte chiare a parte il non usarle.

Esistono diversi soluzioni:

  • Usa i commenti in stile C, quindi toglili prima di passarli al parser
  • Incorpora commenti nei dati
{
  "//": "comment",
  "data": 1
}
  • Incorpora i commenti e li sovrascrive con i dati
{
  "data": "comment",
  "data": 1
}

La seconda voce di data sovrascriverà il commento nella maggior parte dei parser .

soluzioni

Per semplificare la scrittura di JSON, utilizzare un IDE che verifica la presenza di errori di sintassi e fornisce la colorazione della sintassi. I plugin sono disponibili per la maggior parte degli editori.

Quando sviluppi applicazioni e strumenti, usa JSON internamente e come protocollo, ma cerca di non esporlo in luoghi in cui è probabile che un essere umano debba modificarlo a mano (eccetto per il debug).

Valuta altri formati che sono più adatti per questo uso, come:

  • Hjson , può essere convertito senza problemi da e verso JSON
  • TOML , simile ai file INI
  • YAML , più funzioni ma al costo di una maggiore complessità

Motivazioni per Array vs Object (cioè quando usare cosa)

Gli array JSON rappresentano una raccolta di oggetti. In JS, c'è un sacco di funzioni di raccolta fuori di loro come slice , pop , push . Gli oggetti hanno solo più dati grezzi.

Un JSONArray è una sequenza di valori ordinati . La sua forma di testo esterna è una stringa avvolta in parentesi quadre con virgole che separano i valori.

Un JSONObject è una raccolta non ordinata di coppie nome / valore . La sua forma esterna è una stringa avvolta in parentesi graffe con i due punti tra i nomi e i valori e le virgole tra i valori e i nomi.

Oggetto - chiave e valore, Array - numeri, stringhe, booleani. Quando usi questo o quello?

Puoi pensare agli Array come "è un / un" e Oggetti come "ha un". Usiamo "Frutta" come esempio. Ogni articolo nella gamma di frutta è un tipo di frutta.

array fruit : [orange, mango, banana]

Le matrici possono contenere oggetti, stringhe, numeri, matrici, ma consentono di gestire solo oggetti e matrici.

array fruit : [orange:[], mango:{}, banana:{}]

. Puoi vedere che anche l'arancione è una matrice. Implica qualsiasi oggetto che va int arancione è un tipo di arancione, ad esempio: bitter_orange, mandarin, sweet_orange.

per oggetto frutta, qualsiasi oggetto in esso è un attributo di frutta. quindi il frutto ha a

object fruit :{seed:{}, endocarp:{},flesh:{}}

Ciò implica anche che qualsiasi cosa all'interno dell'oggetto seme debba essere proprietà di seme, ad esempio: colore, ..

JSON è principalmente un linguaggio che consente la serializzazione di oggetti javascript in stringhe. Quindi, dopo aver deserializzato una stringa JSON, dovresti ottenere una struttura di oggetti javascript. Se il tuo json si deserializza in un oggetto che memorizza 100 oggetti chiamati da object1 a object100, allora questo sarà molto scomodo. La maggior parte dei deserializzatori si aspetta che tu abbia oggetti e matrici conosciute di oggetti noti, in modo che possano convertire le stringhe nella struttura dell'oggetto reale nella lingua che stai utilizzando. Anche questa è una domanda che la filosofia del design orientato agli oggetti ti risponderebbe.

crediti a tutti i particolari Quali sono le differenze tra l'uso di matrici JSON e oggetti JSON?



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow