¿Qué estructura JSON usar para los pares de valores clave?

12

¿Qué formato JSON es una mejor opción para los pares de valores clave y por qué?

[{"key1": "value1"}, {"key2": "value2"}]

O:

[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]

O:

{"key1": "value1", "key2": "value2"}

La primera variante parece más compacta y más "semánticamente significativa". La segunda variante parece más estructurada, lo que podría ayudar a procesarla. La tercera variante parece aún más semántica.

Los pares de valores clave se utilizarán para adjuntar datos arbitrarios a algún otro elemento. Los datos deben ser serializados como JSON para redondearlos a través de un sistema.

    
pregunta boot4life 07.06.2016 - 18:36

4 respuestas

6

Si elige la primera o la tercera opción depende de su caso de uso. Si está modelando muchas instancias diferentes del mismo tipo de cosas, elija la primera. Por ejemplo, tienes una lista de personas. Si está modelando muchos atributos diferentes de una cosa, elija el tercero. Puede repetir las claves en el primer formato, pero no en el tercero.

La segunda opción es terrible, y todavía tengo que encontrar un caso de uso adecuado para ella. La razón por la que es terrible, además de ser más detallado, es que para JSON de un solo nivel, rompe la conversión automática de la mayoría de las bibliotecas a un diccionario / mapa. Para JSON profundamente anidado, rompe la interfaz de consulta XPath-like .

Esto hace que sea un dolor trabajar con él. Y si no conoce sus claves en tiempo de compilación, querrá un diccionario o una interfaz XPath, porque no podrá convertirlo a una clase. Puede que no parezca un gran problema ahora, pero cuanto más tiempo tenga un formato de datos, más difícil será cambiarlo.

    
respondido por el Karl Bielefeldt 07.06.2016 - 19:36
5

El tercer formato es en general el mejor. Sin embargo, aquí hay un ejemplo de algo adecuado para el primer formato:

[{
  "username": "foo",
  "id": 1
}, {
  "username": "bar",
  "id": 2
}, {
  "username": "baz",
  "id": 3
}]

Aquí, cada objeto se refiere a una cosa separada (y cada objeto usa las mismas claves que los otros, por lo que no se pudieron fusionar). Sin embargo, cada objeto en la lista se almacena como { "username": "foo", "id": 1 } en lugar de [{ "username": "foo" }, { "id": 1 }] porque 1) es más corto y 2) se refiere a una cosa con un nombre de usuario y una identificación, no una cosa con un nombre de usuario y otra cosa con una identificación .

El problema con la segunda opción es que se vuelve muy detallado tanto como JSON y para trabajar con él. Sin embargo, podría usarse si necesita almacenar metainformación sobre la propiedad. Un ejemplo:

{
  "key": "foo",
  "value": 1,
  "mutable": true
}

Aquí mutable se refiere a un caso hipotético de si puede modificar la propiedad en sí, no el objeto principal. La información meta de este tipo es similar a Object.defineProperty de JavaScript, que almacena información "configurable", "enumerable" y "escribible" sobre una propiedad.

    
respondido por el gcampbell 07.06.2016 - 19:36
4

Usted dice que estos son pares clave / valor. En ese caso, use # 3: diccionario de pares clave / valor.

Si estos son no pares de clave / valor, entonces no los llamemos "claves" y "valores" y use # 2, una serie de diccionarios con contenido arbitrario.

La estructura # 1 es simplemente tonta a menos que necesite pares clave / valor pero también su orden. Lo que rara vez haces.

    
respondido por el gnasher729 07.06.2016 - 23:15
2

Ponte en los zapatos de la persona que recibe el json. Si no sé el nombre de la clave, ¿cómo se supone que debo recuperarlo con el primer o el último formato? Por supuesto, puede recorrer el json, pero como los tres formatos logran el mismo resultado, es solo una cuestión de sintaxis. Creo que esta es la única pregunta significativa: si sabe que los nombres de las teclas la primera o la última opción son más compactas, si no la segunda opción es más comprensible.

    
respondido por el JoulinRouge 07.06.2016 - 19:00

Lea otras preguntas en las etiquetas