Come rappresentare un set in JSON?

4

JSON supporta le seguenti strutture dati (equivalenti Java): Scalare, Array / Elenco e Mappa.

Un Set non è supportato immediatamente in JSON.

Ho pensato a diversi modi per rappresentare un set in JSON:

[1] - Come elenco

Tuttavia, un elenco ha il proprio ordine, quindi i seguenti due elenchi, ["a", "b"] e ["b", "a"] non sono uguali come elenchi, ma dovrebbero essere uguali come insiemi.

[2] - Come una mappa

Utilizza il set di chiavi della mappa e ignora i valori.

Ma di nuovo, usando il confronto standard, i due non sono gli stessi delle mappe:

{"a": "foo", "b": "bar"} , {"a": null, "b": null}

[3] - Come una mappa, con un valore speciale

Prendi uno scalare, diciamo 0 o null e impone che sia il valore di ogni chiave nella mappa:

{"a": 0, "b": 0}

In questo modo, con gli strumenti di confronto standard, gli oggetti sono uguali, anche se l'ordine delle chiavi è cambiato.

Tuttavia, questa tecnica inquina il documento JSON con dati irrilevanti.

[4] - Come elenco ordinato

Torna al primo suggerimento, ma questa volta come lista ordinata. Questo tipo di soluzione risolve il problema di confronto.

Tuttavia, dovremmo anche ricordare la complessità dell'ordinamento e anche che la notazione della mappa gestisce i duplicati, mentre un elenco ordinato non lo fa. Esempio:

{"a": 400, "a": 9} è gestito come {"a": 9} , ma ["g", "g"] sarà sempre ["g", "g"] .

Detto questo, mi sembra che la notazione delle liste sia più chiara, ma la notazione della mappa è più solida alla duplicazione delle chiavi e rende più difficile essere coerenti con il valore speciale (anche se null sembra un buona scelta per questo).

Che ne pensi? Come rappresenteresti un set in JSON?

P.S.

Da notare che questa domanda riguarda semplicemente JSON. So che altri formati, come yaml, sono disponibili. Ancora ...

    
posta Ron Klein 06.08.2017 - 00:10
fonte

1 risposta

7

Bene, non puoi. Come hai detto, puoi rappresentare array e dizionari. Hai due scelte.

Rappresenta l'insieme come una matrice. Vantaggio: la conversione da set ad array e viceversa è solitamente semplice. Svantaggio: un array ha un ordine implicito, che un set non ha, quindi la conversione di set identici in array JSON può creare array che sarebbero considerati diversi. Non c'è modo di far rispettare gli elementi dell'array in modo univoco, quindi un array JSON potrebbe non contenere un set valido (ovviamente potresti semplicemente ignorare i duplicati, ma è probabile che ciò avvenga comunque).

Rappresenta il set come dizionario, con un valore arbitrario per chiave, ad esempio 0 o null. Se semplicemente ignori i valori, questa è una corrispondenza perfetta. D'altra parte, potresti non avere supporto per la libreria per estrarre le chiavi di un dizionario come set o per trasformare un set in un dizionario.

Nel mio ambiente di programmazione, la conversione tra set e array è più semplice (la matrice da impostare perderà valori duplicati, che non dovrebbero essere lì, o sarebbe considerata corretta), quindi per questo motivo andrei con gli array. Ma questa è una questione di opinione.

MA: C'è un elefante grasso nella stanza che non è stato menzionato. Le chiavi in un dizionario JSON possono essere solo stringhe. Se il tuo set non è un insieme di stringhe, hai solo la possibilità di usare un array.

    
risposta data 06.08.2017 - 20:39
fonte

Leggi altre domande sui tag