json - tools - objectmapper vs gson performance




Representando null em JSON (5)

De acordo com a especificação JSON , o contêiner mais externo não precisa ser um dicionário (ou 'objeto') como está implícito na maioria dos comentários acima. Também pode ser uma lista ou um valor simples (ou seja, string, number, boolean ou null). Se você quiser representar um valor nulo em JSON, a string JSON inteira (excluindo as aspas que contêm a string JSON) é simplesmente null . Sem chaves, sem colchetes, sem citações. Você poderia especificar um dicionário contendo uma chave com um valor nulo ( {"key1":null} ), ou uma lista com um valor nulo ( [null] ), mas estes não são valores nulos - eles são dicionários e listas apropriados. Da mesma forma, um dicionário vazio ( {} ) ou uma lista vazia ( [] ) são perfeitamente bem, mas também não são nulos.

Em Python:

>>> print json.loads('{"key1":null}')
{u'key1': None}
>>> print json.loads('[null]')
[None]
>>> print json.loads('[]')
[]
>>> print json.loads('{}')
{}
>>> print json.loads('null')
None

Qual é o método preferido para retornar valores nulos em JSON? Existe uma preferência diferente por primitivos?

Por exemplo, se meu objeto no servidor tiver um Integer chamado "myCount" sem valor, o JSON mais correto para esse valor seria:

{}

ou

{
    "myCount": null
}

ou

{
    "myCount": 0
}

A mesma pergunta para Strings - se eu tiver uma string nula "myString" no servidor, é o melhor JSON:

{}

ou

{
    "myString": null
}

ou

{
    "myStrung": ""
}

ou (senhor me ajude)

{
    "myString": "null"
}

Eu gosto da convenção de coleções para ser representada no JSON como uma coleção vazia http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

Um Array vazio seria representado:

{
    "myArray": []
}

EDITAR RESUMO

O argumento da “preferência pessoal” parece realista, mas curto, visto que uma comunidade estará consumindo um número maior de serviços / fontes díspares. Convenções para estrutura JSON ajudariam a normalizar o consumo e a reutilização de tais serviços. Quanto ao estabelecimento de um padrão, sugiro adotar a maioria das convenções de Jackson com algumas exceções:

  • Objetos são preferidos em relação aos primitivos.
  • Coleções vazias são preferidas sobre null.
  • Objetos sem valor são representados como nulos.
  • Primitivos 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 Maven:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.3.0</version>
</dependency>

Esta é uma escolha pessoal e situacional. O importante é lembrar que a string vazia e o número zero são conceitualmente distintos de null .

No caso de uma count você provavelmente sempre quer um número válido (a menos que a count seja desconhecida ou indefinida), mas no caso de strings, quem sabe? A string vazia pode significar algo em sua aplicação. Ou talvez não. Isso é com você para decidir.


Eu usaria null para mostrar que não há valor para essa chave específica. Por exemplo, usar null para representar que "o número de dispositivos em sua residência se conecta à internet" é desconhecido.

Por outro lado, use {} se essa chave específica não for aplicável. Por exemplo, você não deve mostrar uma contagem, mesmo que null , para a pergunta "número de carros que possui conexão ativa com a Internet" solicitada a alguém que não possui nenhum carro.

Eu evitaria padronizar qualquer valor a menos que esse padrão fizesse sentido. Embora você possa decidir usar null para representar nenhum valor, certamente nunca use "null" para fazer isso.


Existe apenas uma maneira de representar null ; isso é com null .

console.log(null === null);   // true
console.log(null === true);   // false
console.log(null === false);  // false
console.log(null === 'null'); // false
console.log(null === "null"); // false
console.log(null === "");     // false
console.log(null === []);     // false
console.log(null === 0);      // false

Isso quer dizer; se algum dos clientes que consomem sua representação JSON usar o operador === ; poderia ser um problema para eles.

sem valor

Se você quiser transmitir que você tem um objeto cujo atributo myCount não tem valor:

{ "myCount": null }

nenhum atributo / atributo ausente

E se você disser que você tem um objeto sem atributos:

{}

O código do cliente tentará acessar myCount e ficar undefined ; não está lá.

coleção vazia

E se você disser que tem um objeto com um atributo myCount que é uma lista vazia:

{ "myCount": [] }

null não é zero. Não é um valor, por si só : é um valor fora do domínio da variável que indica dados ausentes ou desconhecidos.

Existe apenas uma maneira de representar null em JSON. De acordo com as especificações ( RFC 4627 e json.org ):

2.1.  Values

A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:

  false null true







gson