Debería JSON incluir valores nulos [cerrado]

Estoy creando una API que devuelve resultados como JSON. ¿Existe alguna práctica recomendada actual sobre si debemos incluir claves en el resultado cuando el valor es nulo? Por ejemplo:

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}

or

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}

Como el segundo es más pequeño, me inclino por este estilo, pero no estoy seguro de si hay un estilo preferido o no. Desde la perspectiva del cliente, parece que ambos estilos serían funcionalmente equivalentes. ¿Pros o contras de cada uno?

preguntado el 12 de junio de 12 a las 20:06

Es imposible responder esto correctamente. La respuesta correcta depende de los requisitos de la aplicación. El OP simplemente ha seleccionado la respuesta que se adapta a sus requisitos. Si su aplicación necesita poder distinguir entre saber si el "isbn" es nulo y si es posible que el "isbn" no se haya enviado desde el servidor por otro motivo, debe incluirlo. -

@Jacob Aunque no lo dije, mi intención con esta pregunta era que se devolviera el JSON "completo" que representaba la respuesta. Cuando un cliente puede asumir que no parece haber diferencia funcional entre los dos enfoques. Si la API no devolviera selectivamente claves/valores, entonces sí, marcaría una gran diferencia qué enfoque se tomó. -

el beneficio de la primera representación es que se conserva el esquema del objeto, la presencia de la propiedad no es ambigua en función de los datos. en el segundo formato esta información se pierde. La especificación JSON como tal no exige ningún formato AFAIK -

Creo que no hay nada obstinado sobre esta pregunta. JSON es un estándar. Debería haber una especificación para ello, y probablemente un montón de RFC. // Además de eso, incluso las preguntas obstinadas pueden ser aceptables. Ha habido discusiones sobre esto antes en meta.stackexchange donde dictaminaron que las preguntas obstinadas están bien desde el punto de compartir "mejores prácticas". -

5 Respuestas

Soy fanático de siempre incluir nulo explícitamente ya que tiene significado. Mientras que la omisión de una propiedad deja ambigüedad.

Siempre que se acuerde su protocolo con el servidor, cualquiera de los anteriores puede funcionar, pero si pasa nulos desde el servidor, creo que eso hace que sus API sean más flexibles más adelante.

También debería mencionar que la función hasOwnProperty de javascript le brinda más información.

/* if true object DOES contain the property with *some* value */
if( objectFromJSON.hasOwnProperty( "propertyName" ) )

/* if true object DOES contain the property and it has been set to null */
if( jsonObject.propertyName === null )

/* if true object either DOES NOT contain the property
   OR
   object DOES contain the property and it has been set to undefined */
if( jsonObject.propertyName === undefined )

Respondido 09 Abr '15, 07:04

Exactamente, más personas necesitan entender la diferencia entre "", nulo e indefinido. La respuesta a esta pregunta depende de los requisitos de los usuarios. - arrendajo

+1. La persona en el otro extremo (que escribió el código) estará mejor atendida por valores explícitos. Puede que no estén escribiendo JavaScript ;-) - Steve11235

¡Tenga en cuenta que verificar contra nulo no funciona con ==, === es obligatorio (porque no está definido == nulo)! - Tommy

exactamente la primera parte de la respuesta aceptada es tan incorrecta ... - Srneczek

Yo escribiría "propertyName" in objectFromJSON en lugar de objectFromJSON.hasOwnProperty("propertyName"). Además, si insistes en usar hasOwnProperty a continuación, escribir Object.prototype.hasOwnProperty.call(objectFromJSON, "propertyName") por seguridad. - Aadit M Shah

El segundo ahorrará una pequeña cantidad de ancho de banda, pero si eso fuera una preocupación, también usaría matrices indexadas en lugar de llenar el JSON con claves. Claramente, ["Foo Bar","Joe Blow"] es mucho más corto que lo que tienes ahora.

En términos de usabilidad, no creo que haga ninguna diferencia. En ambos casos, if(json.isbn) saltará a la else. Por lo general, no es necesario distinguir entre null (sin valor) y undefined (sin valor dado).

Respondido el 12 de junio de 12 a las 20:06

+1 para Por lo general, no es necesario distinguir entre nulo (sin valor) e indefinido (sin valor dado). Incluso hay un operador útil para ello. != null (intención no estricta) - Esailija

El único caso en el que puedo pensar sería probar si un navegador admite un determinado tipo de evento. Por ejemplo, if( typeof onbeforepaste == "undefined") para ver si onBeforePaste esta apoyado. Incluso entonces, no hace ninguna diferencia real, ya que puede asignar eventos todo lo que quiera (simplemente no harán nada si no son compatibles). - Niet el oscuro Absol

En términos de guardar bytes transferidos, la compresión es mucho más importante que cosas como arreglos indexados. web-resource-optimization.blogspot.no/2011/06/… Asegúrate de que sea lo primero que hagas. En la mayoría de los casos, agregar cosas como matrices indexadas encima de eso es lo que yo llamaría optimización prematura. A menos que esté enviando GRANDES cantidades de datos. Eso también requiere un análisis adicional, lo que agrega más complejidad a su aplicación. Gzipping se realiza sin problemas por el navegador. (asumiendo que el cliente es un navegador) - Martín Hansen

Con HTTPS convirtiéndose en la norma del día (al menos para las aplicaciones con una gran base de usuarios), la compresión se pierde. Ver en.wikipedia.org/wiki/CRIME_%28security_exploit%29 - gvaish

De hecho, haría -1 esto para "Normalmente no hay necesidad de distinguir entre nulo" si tuviera reputación. Por 2 razones: 1. Existen razones para distinguir y no son raras 2. La mejor práctica es tener siempre valores "bien definidos", lo que significa siempre evitar cualquier ambigüedad - 2 significados de 1 valor siempre es malo - debería ser bastante claro ... - Srneczek

En JavaScript null significa algo muy diferente a undefined.

Su salida JSON debe reflejar lo que usa y necesita su aplicación en el contexto específico del uso de los datos JSON.

Respondido el 12 de junio de 12 a las 20:06

No hay "indefinido" en JSON, por lo que creo que solo pregunta si debe incluir propiedades "vacías" o no: {"prop":undefined} es diferente de {}. - Bergi

De acuerdo, estoy tratando de explicar que en el extremo receptor, si está buscando que una propiedad específica se establezca en nulo, no lo será. Será indefinido, si se deja fuera. - Brad

Definitivamente debería incluirlo si hay alguna necesidad de distinguir entre null y undefined ya que esos tienen dos significados diferentes en Javascript. Tu puedes pensar en null en el sentido de que la propiedad es desconocida o no tiene sentido, y undefined en el sentido de que la propiedad no existe.

Por otro lado, si no hay necesidad de que nadie haga esa distinción, continúe y déjela fuera.

Respondido el 12 de junio de 12 a las 20:06

Cuando se utiliza JSON como portador de datos de API, no hay diferencia si hay un valor nulo o vacío (indefinido). Probablemente, el vacío es mejor porque ahorramos algo de tamaño de carga útil.

La diferencia aparece para los archivos de configuración JSON cuando desea editar algo a mano. Es mejor tener nulos allí en lugar de accesorios indefinidos. De esta forma, dará pistas sobre la existencia de accesorios de configuración.

Respondido el 22 de junio de 21 a las 17:06

¿Podría elaborar más su respuesta agregando un poco más de descripción sobre la solución que proporciona? - abarisona

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.