O JSON suporta as seguintes estruturas de dados (equivalentes Java): Escalar, Matriz / Lista e Mapa.
A Set
não é suportado imediatamente no JSON.
Pensei em várias maneiras de representar um conjunto em JSON:
[1] - Como uma lista
No entanto, uma lista tem sua própria ordem, portanto, as duas listas a seguir, ["a", "b"]
e ["b", "a"]
não são iguais a listas, mas devem ser iguais a conjuntos.
[2] - Como um mapa
Use o conjunto de chaves do mapa e ignore os valores.
Mas, novamente, usando a comparação padrão, os dois não são iguais aos mapas:
{"a": "foo", "b": "bar"}
, {"a": null, "b": null}
[3] - Como um mapa, com um valor especial
Pegue um escalar, diga 0
ou null
e force-o a ser o valor de cada chave no mapa:
{"a": 0, "b": 0}
Dessa forma, nas ferramentas de comparação padrão, os objetos são iguais, mesmo que a ordem das teclas seja alterada.
No entanto, essa técnica polui o documento JSON com dados irrelevantes.
[4] - Como uma lista ordenada
Voltar para a primeira sugestão, mas desta vez como uma lista ordenada. Isso meio que resolve o problema de comparação.
No entanto, também devemos ter em mente a complexidade da classificação e também que a notação de mapa lida com duplicatas, enquanto uma lista classificada não. Exemplo:
{"a": 400, "a": 9}
é tratado como {"a": 9}
, mas ["g", "g"]
sempre seria ["g", "g"]
.
Dito tudo isso, parece-me que a notação da lista é mais clara, mas a notação do mapa é mais robusta à duplicação de chaves e dificulta a coerência com o valor especial (embora null
pareça uma boa opção para isso).
O que você acha? Como você representaria um conjunto em JSON?
PS
Observe que a pergunta é apenas sobre JSON. Eu sei que outros formatos, como o yaml, estão disponíveis. Ainda...
fonte
Respostas:
Bem, você não pode. Como você disse, você pode representar matrizes e dicionários. Você tem duas escolhas.
Represente o conjunto como uma matriz. Vantagem: geralmente é fácil converter do conjunto para o array e vice-versa. Desvantagem: uma matriz tem uma ordem implícita, que um conjunto não possui, portanto, a conversão de conjuntos idênticos em matrizes JSON pode criar matrizes que seriam consideradas diferentes. Não há como impor que os elementos da matriz sejam exclusivos, portanto, uma matriz JSON pode não conter um conjunto válido (obviamente, você pode simplesmente ignorar as duplicatas; é isso que provavelmente acontecerá de qualquer maneira).
Representa o conjunto como um dicionário, com um valor arbitrário por chave, por exemplo 0 ou nulo. Se você simplesmente ignorar os valores, é uma combinação perfeita. Por outro lado, você pode não ter suporte de biblioteca para extrair as chaves de um dicionário como um conjunto ou para transformar um conjunto em um dicionário.
No meu ambiente de programação, a conversão entre conjunto e matriz é mais fácil (a matriz a definir perderá valores duplicados, que não deveriam estar lá ou seriam considerados corretos), portanto, por esse motivo, eu usaria matrizes. Mas isso é uma questão de opinião.
MAS: Há um elefante grande e gordo na sala que não foi mencionado. As chaves em um dicionário JSON podem ser apenas cadeias de caracteres. Se o seu conjunto não for um conjunto de strings, você poderá escolher apenas uma matriz.
fonte
Não tente representar conjuntos em JSON. Faça isso ao analisar os dados.
Seus dados JSON devem ter um esquema que especifique quais campos devem ser tratados como um conjunto ou você pode ter metadados incorporados nos próprios dados JSON que descrevem quando uma lista deve ser tratada como um conjunto (por exemplo
{"houses": {"_type": "set", "value": [...]}}
) ou com uma convenção de nomenclatura.Observe que, de acordo com o padrão JSON, um objeto JSON pode ter chaves duplicadas. Formulações ECMA-404:
AFAICD, nada na especificação proíbe nomes não exclusivos e há muitas implementações de analisador JSON que podem analisar nomes de objetos não exclusivos. O RFC 7159 desencoraja nomes não exclusivos para interoperabilidade, mas especificamente não o proíbe e continua listando como vários analisadores foram vistos manipulando nomes de objetos não exclusivos.
E o ECMA 404 também não exige que a ordem das matrizes seja preservada:
Essa redação permite que os aplicativos usem matrizes para representar conjuntos, se assim o desejarem.
fonte