Quale struttura JSON usare per coppie di valori chiave?

12

Quale formato JSON è una scelta migliore per coppie di valori chiave e perché?

[{"key1": "value1"}, {"key2": "value2"}]

o

[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]

o

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

La prima variante sembra più compatta e più "semanticamente significativa". La seconda variante sembra strutturata in modo più uniforme e potrebbe essere utile per elaborarla. La terza variante sembra ancora più semantica.

Le coppie di valori chiave verranno utilizzate per allegare dati arbitrari ad altri elementi. I dati devono essere serializzati come JSON per arrotondare la punta attraverso un sistema.

    
posta boot4life 07.06.2016 - 18:36
fonte

4 risposte

6

Se scegli la prima o la terza opzione dipende dal tuo caso d'uso. Se stai modellando molte diverse istanze dello stesso tipo di cosa, scegli la prima. Ad esempio, hai una lista di persone. Se stai modellando molti attributi diversi di una cosa, scegli la terza. Puoi avere tasti ripetuti nel primo formato, ma non nel terzo.

La seconda opzione è terribile, e devo ancora trovare un caso d'uso appropriato per questo. Il motivo per cui è terribile, oltre a essere più prolisso, è che per JSON a livello singolo, si interrompe la conversione automatica della maggior parte delle librerie in un dizionario / mappa. Per JSON con nidificazione profonda, interrompe l'interfaccia di query XPath .

Questo rende difficile lavorare con. E se non conosci le tue chiavi al momento della compilazione, vorresti un dizionario o un'interfaccia XPath, perché non sarai in grado di convertirli in una classe. Potrebbe non sembrare un grosso problema ora, ma più tempo hai un formato dati, più difficile sarà cambiare.

    
risposta data 07.06.2016 - 19:36
fonte
5

Il terzo formato è in generale il migliore. Tuttavia, ecco un esempio di qualcosa adatto al primo formato:

[{
  "username": "foo",
  "id": 1
}, {
  "username": "bar",
  "id": 2
}, {
  "username": "baz",
  "id": 3
}]

Qui ogni oggetto si riferisce a una cosa separata (e ogni oggetto usa le stesse chiavi degli altri, quindi non possono essere uniti). Tuttavia, ogni oggetto nella lista è memorizzato come { "username": "foo", "id": 1 } piuttosto che [{ "username": "foo" }, { "id": 1 }] perché 1) è più corto e 2) si riferisce a una cosa con un nome utente e un id, non una cosa con un nome utente e un'altra cosa con un ID .

Il problema con la seconda opzione è che diventa molto prolisso sia come JSON che con cui lavorare. Tuttavia, potrebbe essere utilizzato se è necessario memorizzare le meta-informazioni sulla proprietà. Un esempio:

{
  "key": "foo",
  "value": 1,
  "mutable": true
}

Qui mutable fa riferimento a un ipotetico caso in cui è possibile modificare la proprietà stessa, non l'oggetto genitore. Le meta-informazioni come questa sono simili al Object.defineProperty di JavaScript, che memorizza informazioni "configurabili", "enumerabili" e "scrivibili" su una proprietà.

    
risposta data 07.06.2016 - 19:36
fonte
4

Dici che sono coppie chiave / valore. In tal caso, utilizzare # 3: dizionario di coppie chiave / valore.

Se si tratta di coppie chiave / valore non , non chiamarle "chiavi" e "valori" e utilizzare # 2, una matrice di dizionari con contenuti arbitrari.

La struttura n. 1 è semplicemente stupida a meno che non siano necessarie coppie chiave / valore ma anche il loro ordine. Che raramente fai.

    
risposta data 07.06.2016 - 23:15
fonte
2

Mettiti nei panni della persona che riceve il json. Se non conosco il nome della chiave, come posso recuperarlo con il primo o l'ultimo formato? È possibile eseguire il loop del json, ovviamente, ma poiché tutti e tre i formati raggiungono lo stesso risultato è solo una questione di sintassi. Penso che questa sia l'unica domanda significativa: se conosci i nomi delle chiavi, la prima o l'ultima opzione sono più compatte, altrimenti la seconda scelta è più comprensibile.

    
risposta data 07.06.2016 - 19:00
fonte

Leggi altre domande sui tag