JSON admite las siguientes estructuras de datos (equivalentes de Java): escalar, matriz / lista y mapa.
A Set
no es compatible de fábrica en JSON.
Pensé en varias formas de representar un conjunto en JSON:
[1] - Como una lista
Sin embargo, una lista tiene su propio pedido, por lo que las dos listas siguientes, ["a", "b"]
y ["b", "a"]
no son iguales como listas, sino que debe ser igual como conjuntos.
[2] - Como un mapa
Use el conjunto de claves del mapa e ignore los valores.
Pero nuevamente, usando la comparación estándar, los dos no son lo mismo que los mapas:
{"a": "foo", "b": "bar"}
, {"a": null, "b": null}
[3] - Como un mapa, con un valor especial
Tome un escalar, diga 0
o null
y fuerce a que sea el valor de cada clave del mapa:
{"a": 0, "b": 0}
De esta manera, bajo las herramientas de comparación estándar, los objetos son iguales, incluso si se cambia el orden de las claves.
Sin embargo, esta técnica contamina el documento JSON con datos irrelevantes.
[4] - Como una lista ordenada
Volver a la primera sugerencia, pero esta vez como una lista ordenada. Este tipo de resuelve el problema de comparación.
Sin embargo, también debemos tener en cuenta la complejidad de la ordenación, y también que la notación de mapa maneja duplicados, mientras que una lista ordenada no lo hace. Ejemplo:
{"a": 400, "a": 9}
se maneja como {"a": 9}
, pero ["g", "g"]
siempre lo sería ["g", "g"]
.
Habiendo dicho todo eso, me parece que la notación de la lista es más clara, pero la notación del mapa es más robusta para la duplicación de claves y hace que sea más difícil ser coherente con el valor especial (aunque null
parezca una buena opción para eso).
¿Qué piensas? ¿Cómo representaría un conjunto en JSON?
PD
Tenga en cuenta que la pregunta se trata simplemente de JSON. Sé que otros formatos, como yaml, están disponibles. Todavía...
fuente
Respuestas:
Pues no puedes. Como dijiste, puedes representar matrices y diccionarios. Tienes dos opciones.
Representa el conjunto como una matriz. Ventaja: la conversión de conjunto a conjunto y viceversa suele ser fácil. Desventaja: una matriz tiene un orden implícito, que un conjunto no tiene, por lo que la conversión de conjuntos idénticos en matrices JSON puede crear matrices que se considerarían diferentes. No hay forma de exigir que los elementos de la matriz sean únicos, por lo que una matriz JSON podría no contener un conjunto válido (obviamente, simplemente podría ignorar los duplicados; eso es lo que probablemente sucederá de todos modos).
Representa el conjunto como un diccionario, con un valor arbitrario por clave, por ejemplo 0 o nulo. Si simplemente ignora los valores, esta es una combinación perfecta. Por otro lado, es posible que no tenga soporte de biblioteca para extraer las claves de un diccionario como un conjunto, o para convertir un conjunto en un diccionario.
En mi entorno de programación, la conversión entre set y array es más fácil (el array a configurar perderá valores duplicados, que no deberían estar allí o se considerarían correctos), por lo que iría con los arrays. Pero eso es en gran medida una cuestión de opinión.
PERO: Hay un gran elefante gordo en la habitación que no se ha mencionado. Las claves en un diccionario JSON solo pueden ser cadenas. Si su conjunto no es un conjunto de cadenas, entonces solo tiene la opción de usar una matriz.
fuente
No intentes representar conjuntos en JSON. Hazlo cuando analices los datos.
Sus datos JSON deben tener un esquema que especifique qué campos deben tratarse como un conjunto, o puede tener metadatos incrustados en los propios datos JSON que describen cuándo una lista debe tratarse como un conjunto (por ejemplo
{"houses": {"_type": "set", "value": [...]}}
) o con una convención de nomenclatura.Tenga en cuenta que según el estándar JSON, un objeto JSON puede tener claves duplicadas. Redacciones de ECMA-404:
AFAICD, nada en la especificación prohíbe nombres no únicos, y hay muchas implementaciones de analizador JSON que pueden analizar nombres de objetos no únicos. RFC 7159 desalienta los nombres no únicos para la interoperabilidad, pero específicamente tampoco lo prohíbe, y continúa enumerando cómo se han visto varios analizadores que manejan nombres de objetos no únicos.
Y ECMA 404 tampoco requiere que se conserve el orden de la matriz:
Esta redacción permite que las aplicaciones usen matrices para representar conjuntos si así lo eligen.
fuente