¿Cuál es el método preferido para devolver valores nulos en JSON? ¿Hay una preferencia diferente por las primitivas?
Por ejemplo, si mi objeto en el servidor tiene un número entero llamado "myCount" sin valor, el JSON más correcto para ese valor sería:
{}
o
{
"myCount": null
}
o
{
"myCount": 0
}
La misma pregunta para Strings: si tengo una cadena nula "myString" en el servidor, es el mejor JSON:
{}
o
{
"myString": null
}
o
{
"myString": ""
}
o (señor, ayúdame)
{
"myString": "null"
}
Me gusta la convención para que las colecciones se representen en el JSON como una colección vacía http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Una matriz vacía estaría representada:
{
"myArray": []
}
EDITAR resumen
El argumento de 'preferencia personal' parece realista, pero miope en eso, como comunidad consumiremos un número cada vez mayor de servicios / fuentes dispares. Las convenciones para la estructura JSON ayudarían a normalizar el consumo y la reutilización de dichos servicios. En cuanto a establecer un estándar, sugeriría adoptar la mayoría de las convenciones de Jackson con algunas excepciones:
- Se prefieren los objetos sobre los primitivos.
- Se prefieren las colecciones vacías a las nulas.
- Los objetos sin valor se representan como nulos.
- Las primitivas devuelven su valor.
Si está devolviendo un objeto JSON con valores mayormente nulos, puede tener un candidato para refactorizar en múltiples servicios.
{
"value1": null,
"value2": null,
"text1": null,
"text2": "hello",
"intValue": 0, //use primitive only if you are absolutely sure the answer is 0
"myList": [],
"myEmptyList": null, //NOT BEST PRACTICE - return [] instead
"boolean1": null, //use primitive only if you are absolutely sure the answer is true/false
"littleboolean": false
}
El JSON anterior se generó a partir de la siguiente clase Java.
package jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonApp {
public static class Data {
public Integer value1;
public Integer value2;
public String text1;
public String text2 = "hello";
public int intValue;
public List<Object> myList = new ArrayList<Object>();
public List<Object> myEmptyList;
public Boolean boolean1;
public boolean littleboolean;
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Data()));
}
}
Dependencia de Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
NSNull
clase definida que tiene una instancia singleton. Una referencia a esa instancia es equivalente a la de JSON null
. Supongo que otro idioma podría hacer lo mismo. Por supuesto, uno tendría que verificar la clase del objeto recibido antes de lanzar a la clase presunta, por lo tanto, tenga "nulo conocimiento".
Collections.emptyList()
). Al hacerlo, se evitan errores de referencia nulos que, de lo contrario, pueden ser un dolor.
Null
clase (útil) porque solo podría asignar sus valores a objetos de su propio tipo o de tipo Object
.
null
considerar si su cliente es mejor con la cadena vacía o sinull
una cadena que contiene la palabra "nulo" no se puede distinguir de un valor válido, no lo haga.