2012-03-08 18 views
32

Sé que en la mayoría de los escenarios de programación, la preferencia es que las colecciones vacías anulen las colecciones cuando hay 0 elementos. Sin embargo, la mayoría de los lenguajes que consumen JSON (como JavaScript) tratarán las listas/los objetos vacíos como verdaderos y los nulos como falsos. Por ejemplo, esto sería a la vez verdadera y un objeto en JavaScript:¿cuál es la convención en JSON para vacío vs. nulo?

{ 
    "items_in_stock": {"widgets":10, "gadgets": 5} 
} 

Pero esto también es cierto:

{ 
    "items_in_stock": {} 
} 

Y esto es falso:

{ 
    "items_in_stock": null 
} 

¿Hay una convención sobre objetos vacíos/listas para JSON? ¿Y para números, booleanos y cadenas?

+0

relacionado: [En caso de que JSON incluya valores nulos] (http://stackoverflow.com/q/11003424/1048572) – Bergi

+0

pregunta relacionada no respondida aquí: cómo trata JSON vacía instrumentos de cuerda. Y, además, ¿una cadena de longitud cero para un objeto que no sea cadena se tratará como nula? – tdugan

Respuesta

47

Es una buena práctica de programación devolver una matriz vacía si el tipo de retorno esperado es una matriz. Esto asegura que el receptor de json puede tratar el valor como una matriz inmediatamente y no tiene que verificar primero si es nulo. Es lo mismo con objetos vacíos ({}). Las cadenas, los booleanos y los enteros no tienen una forma 'vacía', por lo que está bien usar valores nulos.

No crea en mi palabra. En el excelente libro de Joshua Blochs, "Effective Java", describe algunas prácticas de programación genéricas muy buenas (a menudo aplicables a otros lenguajes de programación). Devolver colecciones vacías en lugar de nulos es una de ellas. Aquí hay un enlace a esa parte de su libro: http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

+1

En JavaScript, ¿podría verificar si (items_in_stock == null) o podría verificar si (items_in_stock)? ¿Los desarrolladores de JavaScript prefieren no usar las características "truthy/falsey" del idioma? – rzrelyea

+1

La mayoría de las personas lo usan mucho. Personalmente trato de evitar el uso del código truthy/falsy, aunque tiene sus beneficios (menos código). Puede conducir a errores difíciles de rastrear. Por ejemplo: muchas personas establecen valores predeterminados para sus parámetros de función de esta manera: _function func (a) {a = a || ''; ...} _. Cuando _a_ no está definido, nulo, 0, -1, '', falso o NaN obtendrá el valor '', que puede o no ser el deseado (la mayoría de las veces solo se quiere definir como nulo). Esto puede llevar a un comportamiento extraño. Mucha gente lo usa porque es conveniente. – koenpeters

+1

Supongo que no tiene ningún enlace de documentación para respaldar eso? Estoy tratando de convencer a un desarrollador de API de lo mismo, pero es una batalla cuesta arriba. – MikeyWard

4

"JSON tiene un valor especial llamado null que se puede establecer en cualquier tipo de datos, incluidos matrices, objetos, números y tipos booleanos".

"El concepto vacío JSON se aplica a matrices y objetos ... El objeto de datos no tiene un concepto de listas vacías. Por lo tanto, no se realiza ninguna acción en el objeto de datos para esas propiedades."

Here es mi fuente.

+1

La fuente de referencia muestra cómo usar tanto nulos como objetos/matrices vacíos. Tal vez no lo estoy leyendo correctamente, pero no parece sugerir uno sobre el otro. Y no aborda cómo el consumo de JavaScript de JSON influye en la elección. – rzrelyea

+0

¿Qué pasa con una cadena vacía? hemos estado viendo problemas donde JSON trata la cadena vacía (cadena de longitud cero) como un nulo (campo vacío). – tdugan

Cuestiones relacionadas