Como representar um conjunto em JSON?


14

O JSON suporta as seguintes estruturas de dados (equivalentes Java): Escalar, Matriz / Lista e Mapa.

A Setnã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 0ou nulle 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 nullpareç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...


11
Os conjuntos não são suportados pelo JSON, estão fora do escopo. Existe um conjunto ou uma coleção exclusiva e distinta no escopo do aplicativo. Por ser uma coleção, seria mais óbvio usar a sintaxe da coleção.
Zymus 6/08/19

11
Por que você deseja representar conjuntos em JSON? Lembre-se de que JSON é um formato de troca.
Andres F.

@AndresF. Eu pensei que seria uma boa idéia expressar o atributo de exclusividade dos valores. Eu não amarraria o JSON apenas ao formato de troca. Também pode ser útil para armazenamento de documentos (como no MongoDB).
Ron Klein

@RonKlein Fair bastante. Mas ugh ... não me faça começar com MongoDB: P
Andres F.

No YAML, os conjuntos são representados como sua opção [3], mas possui uma notação especial de que o JSON não possui.
Jasmijn

Respostas:


20

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.


4
o caso extremo de não-strings é um bom argumento contra um dicionário.
Ron Klein

3

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:

Objetos

[...] A sintaxe JSON não impõe nenhuma restrição às cadeias usadas como nomes, não exige que as cadeias de nomes sejam exclusivas e não atribui nenhum significado à ordem dos pares nome / valor. Essas são todas considerações semânticas que podem ser definidas pelos processadores JSON ou nas especificações que definem usos específicos do JSON para o intercâmbio de dados.

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:

Matrizes

A sintaxe JSON não define nenhum significado específico para a ordem dos valores. No entanto, a estrutura da matriz JSON é frequentemente usada em situações em que há alguma semântica na ordem.

Essa redação permite que os aplicativos usem matrizes para representar conjuntos, se assim o desejarem.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.