Qual é o método preferido para retornar valores nulos em JSON? Existe uma preferência diferente para primitivas?
Por exemplo, se meu objeto no servidor tiver um número inteiro chamado "myCount" sem valor, o JSON mais correto para esse valor seria:
{}
ou
{
"myCount": null
}
ou
{
"myCount": 0
}
Mesma pergunta para Strings - se eu tiver uma string nula "myString" no servidor, é o melhor JSON:
{}
ou
{
"myString": null
}
ou
{
"myString": ""
}
ou (senhor me ajude)
{
"myString": "null"
}
Gosto da convenção de coleções ser representada no JSON como uma coleção vazia http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Uma matriz vazia seria representada:
{
"myArray": []
}
Resumo do EDIT
O argumento de 'preferência pessoal' parece realista, mas míope, como comunidade, estaremos consumindo um número cada vez maior de serviços / fontes diferentes. As convenções para a estrutura JSON ajudariam a normalizar o consumo e a reutilização desses serviços. Quanto ao estabelecimento de um padrão, eu sugeriria a adoção da maioria das convenções de Jackson com algumas exceções:
- Os objetos são preferíveis aos primitivos.
- Coleções vazias são preferidas a nulas.
- Objetos sem valor são representados como nulos.
- As primitivas retornam seu valor.
Se você estiver retornando um objeto JSON com valores principalmente nulos, poderá ter um candidato para refatorar em vários serviços.
{
"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
}
O JSON acima foi gerado a partir da seguinte classe 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()));
}
}
Dependência do Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
NSNull
classe definida que possui uma instância singleton. Uma referência a essa instância é equivalente a JSON null
. Eu acho que outro idioma poderia fazer a mesma coisa. Obviamente, seria necessário verificar a classe do objeto recebido antes de converter para a classe presumida - ter "reconhecimento nulo", por assim dizer.
Collections.emptyList()
). Fazer isso evita erros de referência nulos que, caso contrário, podem ser uma dor.
Null
classe (útil) porque só seria capaz de atribuir seus valores a objetos de seu próprio tipo ou tipo Object
.
null
, considere se o seu cliente é melhor com a string vazia ounull
- uma string contendo a palavra "null" é indistinguível de um valor válido, não faça isso.