Come rappresentare un set in JSON?


16

JSON supporta le seguenti strutture di dati (equivalenti Java): scalare, matrice / elenco e mappa.

A Setnon è supportato immediatamente in JSON.

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

[1] - Come elenco

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

[2] - Come una mappa

Utilizzare il set di chiavi della mappa e ignorare i valori.

Ma ancora una volta, 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, dì 0o nulle forzalo ad essere 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'ordinamento delle chiavi viene modificato.

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

[4] - Come un elenco ordinato

Torna al primo suggerimento, ma questa volta come un elenco ordinato. Questo tipo di risolve il problema del confronto.

Tuttavia, dovremmo anche tenere presente la complessità dell'ordinamento e anche che la notazione della mappa gestisce i duplicati, mentre un elenco ordinato no. Esempio:

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

Detto questo, mi sembra che la notazione dell'elenco sia più chiara, ma la notazione della mappa è più robusta per la duplicazione delle chiavi e rende più difficile essere coerenti con il valore speciale (anche se nullsembra una buona scelta per questo).

Cosa ne pensi? Come rappresenteresti un set in JSON?

PS

Si noti che questa domanda riguarda solo JSON. So che sono disponibili altri formati, come Yaml. Ancora...


1
I set non sono supportati da JSON, è al di fuori dell'ambito. Un set, o una raccolta unica e distinta, esiste nell'ambito dell'applicazione. Poiché si tratta di una raccolta, sarebbe più ovvio utilizzare la sintassi della raccolta.
Zimo

1
Perché dovresti voler rappresentare i set in JSON? Ricorda che JSON è un formato di scambio.
Andres F.

@AndresF. Ho pensato che sarebbe stata una buona idea esprimere l'attributo unicità dei valori. Non legherei JSON solo al formato di scambio. Può anche essere utile per l'archiviazione di documenti (come in MongoDB).
Ron Klein,

@RonKlein Abbastanza giusto. Ma ugh ... non farmi iniziare con MongoDB: P
Andres F.

In YAML, i set sono rappresentati come opzione [3], ma ha una notazione speciale che JSON non ha.
Jasmijn il

Risposte:


21

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

Rappresenta il set come un array. Vantaggio: la conversione da set a array e viceversa è in genere semplice. Svantaggio: un array ha un ordine implicito, al contrario di un set, quindi la conversione di set identici in array JSON può creare array che sarebbero considerati diversi. Non c'è modo di imporre che gli elementi dell'array siano univoci, quindi un array JSON potrebbe non contenere un set valido (ovviamente potresti semplicemente ignorare i duplicati; è comunque probabile che accada).

Rappresenta l'insieme come un 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 il supporto della 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 (array da impostare perderà valori duplicati, che o non dovrebbero essere lì o sarebbero considerati corretti), quindi per questo motivo andrei con gli array. Ma questa è una questione di opinione.

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


5
il caso limite delle non stringhe è un buon argomento contro un dizionario.
Ron Klein,

4

Non tentare di rappresentare i set in JSON. Fallo invece quando analizza i dati.

I tuoi dati JSON dovrebbero avere uno schema che specifica quali campi devono essere trattati come un set, oppure potresti avere dei metadati incorporati nei dati JSON stessi che descrivono quando un elenco deve essere trattato come un set (ad esempio {"houses": {"_type": "set", "value": [...]}}) o con una convenzione di denominazione.

Si noti che secondo lo standard JSON, un oggetto JSON può avere chiavi duplicate. Formulazioni ECMA-404:

Oggetti

[...] La sintassi JSON non impone alcuna restrizione alle stringhe utilizzate come nomi, non richiede che le stringhe di nomi siano univoche e non assegna alcun significato all'ordinamento delle coppie nome / valore. Queste sono tutte considerazioni semantiche che possono essere definite dai processori JSON o nelle specifiche che definiscono usi specifici di JSON per lo scambio di dati.

AFAICD, nulla nelle specifiche proibisce nomi non univoci e ci sono molte implementazioni di parser JSON che possono analizzare nomi di oggetti non univoci. RFC 7159 scoraggia i nomi non univoci per l'interoperabilità, ma in particolare non lo proibisce nemmeno, e continua elencando come sono stati visti vari parser che gestiscono nomi di oggetti non univoci.

Inoltre, l'ECMA 404 non richiede la conservazione dell'ordine degli array:

Array

La sintassi JSON non definisce alcun significato specifico per l'ordinamento dei valori. Tuttavia, la struttura dell'array JSON viene spesso utilizzata in situazioni in cui è presente una semantica nell'ordinamento.

Questa formulazione consente alle applicazioni di utilizzare array per rappresentare insiemi, se lo desiderano.

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.