Em termos leigos, Jackson é uma biblioteca de classes Java usada para processar dados no formato JSON e seu desempenho é muito bom. Este artigo dará um exemplo de análise mais detalhado do uso de Jackson. Os detalhes são os seguintes:
1. Introdução
Jackson tem eficiência de serialização e desserialização relativamente alta. De acordo com os testes, não importa a forma de conversão, Jackson> Gson> Json-lib, e o poder de processamento de Jackson é quase 10 vezes maior do que Json-lib, e está correto O sexo também é. muito alto. Em contraste, o Json-lib parece ter parado de ser atualizado, e a versão mais recente também é baseada no JDK15, enquanto a comunidade Jackson está mais ativa.
Abaixo, apresentaremos brevemente o uso de Jackson com exemplos.
2. Uso
Jackson fornece muitas classes e métodos, e a classe mais comumente usada em serialização e desserialização é a classe ObjectMapper, que é semelhante a JsonObject e ArrayObject em Json-lib. Esta classe fornece métodos como readTree(), readValue(), writeValueAsString() para conversão. O endereço de documentação específico para esta classe é: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html.
Para evitar descrições repetidas, o objectMapper mencionado abaixo vem todo de ObjectMapper objectMapper = new ObjectMapper(). O uso será brevemente apresentado abaixo em termos de serialização e desserialização.
1. Serialização
① Serialize as próprias classes do Java
Exemplo de teste
Lista lista=new ArrayList();list.add(1);list.add(2);list.add(3);
Implementar serialização:
String teststringlist=objectMapper.writeValueAsString(lista);System.out.println(teststringlist);
A saída do resultado no console é:
[1,2,3]
para concluir:
Jackson pode implementar facilmente a serialização de tipos gerais.
②Serialização de classes personalizadas
Exemplo de teste:
aluno da classe pública {private int age=10;private String name="hhh"; public String[] list={"hao","haouhao","keyi"}; public Date time=new Date(); () { return idade; } public void setAge(int idade) { this.age = idade } public String getName() { return name; }}
Para tornar o exemplo mais geral, esta classe inclui o tipo de valor int, o tipo de referência String, String[] e o tipo de data Date.
Implementar serialização
aluno st=novo aluno();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
A saída do resultado no console é:
{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","idade":10}
para concluir:
Pela saída, pode-se observar que a string Json convertida está em conformidade com o formato. No entanto, a representação do tempo é um pouco inferior. Modificações no formato da hora serão introduzidas abaixo.
③Definição do formato da hora
Jackson tem seu próprio formato de hora padrão, que é na forma de carimbos de data e hora, e seu efeito é mostrado nos resultados acima (por exemplo: 1375429228382). Se você deseja definir este formato como inválido, passe
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, falso)
Ele pode ser configurado para que a geração da hora use a chamada notação compatível com [ISO-8601], gerando uma hora semelhante ao seguinte formato: "1970-01-01T00:00:00.000+0000".
Claro, você também pode personalizar o formato da hora de saída.
Implementação de formato de hora personalizado
O exemplo também usa a classe de aluno apresentada acima.
aluno st = novo aluno (); objectMapper.writeValueAsString(st);System.out.println(teststringstu);
A saída de demérito no console é:
{"list":["hao","haouhao","keyi"],"time":"2013-08-02 03:48:20","name":"hhh","idade":10}
para concluir:
Percebe-se que o formato de saída da hora se tornou o que desejamos. O método de definição do formato de saída de hora em Jackson é muito mais simples do que definir o formato de hora em Json-lib.
④ Outro método de serialização
Implementar serialização
O exemplo utilizado ainda é o da turma anterior do aluno.
aluno st=novo aluno();JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);jsonGenerator.writeObject(st);
A saída no console é:
{"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","idade":10}
para concluir:
Este método também pode obter o valor do método acima. Mas preste atenção nesta função neste método: createJsonGenerator(), que requer dois parâmetros, um é o parâmetro do tipo OutputStream e o outro é o parâmetro do tipo JsonEncoding. Através desses dois parâmetros, podemos entender que este método pode não apenas escrever Json diretamente no fluxo da rede, mas também escrever Json no fluxo de arquivo ou de memória. Então é mais versátil.
2. Desserialização
①Desserialização única
Este método usa principalmente o método <testJsonClass> readValue(String content, Class<testJsonClass> valueType) fornecido pelo ObjectMapper. Este método requer a inserção de uma string Json e a classe correspondente da classe que precisa ser preenchida e retorna a classe preenchida.
Analisar string Json em classe personalizada
Quando a string Json é:
String test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
tempo.
Primeiro defina uma classe:
public class testJsonClass { public int objectID; public List geoPoints=new ArrayList();}
Em seguida, use o seguinte trecho de código para desserializar Json nesta classe:
testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);
usar
System.out.println(testClass.objectID);System.out.println(testClass.geoPoints)
Os valores que você pode ver na saída do console são:
357[{x=504604,59802246094, y=305569,9150390625}]
Desserialize a string Json na própria classe do sistema Quando a string Json for.
String json = "{"error":0,"data":{"name":"ABC","idade":20,"telefone":{"home":"abc","mobile":"def"}," amigos":[{"nome":"DEF","telefone" :{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"} }]},"outro":{"apelido":[]}}".
Defina uma variável usando o próprio mapa do sistema: mapas Map<String, Map<String, Object>>. Em seguida, use maps = objectMapper.readValue(json, Map.class) para desserializar Json nos mapas de variáveis.
passar
System.out.println(maps.get("erro"));System.out.println((Objeto)(maps.get("dados").get("telefone")))
Você pode obter os seguintes resultados no console:
0{home=abc, celular=def}
②Desserialização gradual
Este método é mais flexível e pode extrair apenas o valor da informação da string Json no qual o usuário está interessado. É implementado principalmente usando o readTree fornecido pelo ObjectMapper e a classe JsonNode fornecida por Jackson.
Exemplo de teste
Corda test="{"resultados":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.915039 0625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
Essa string Json é relativamente complexa, incluindo a forma de matrizes aninhadas, e é universal.
Implementar desserialização
JsonNode node= objectMapper.readTree(test); //Lê a string Json na memória em uma estrutura de árvore JsonNode Contents=node.get("results");//Obtém as informações no nó de resultados for(int i=0 ;i<conteúdo.tamanho();i++) //Atravesse as informações nos resultados, a função size() pode obter o número de informações contidas no nó, semelhante ao comprimento do array {System.out.println(contents.get(i).get("objectID" ). getIntValue()); //Lê o valor de um nó filho no nó JsonNode geoNumber=contents.get(i).get("geoPoints");for(int j=0;j<geoNumber.size();j++) //Percorre as informações nos nós filhos {System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" " +geoNumber.get(j).get("y").getDoubleValue());}}
A saída no console é:
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
para concluir:
Este método é semelhante à análise DOM na análise XML. A vantagem é que a estrutura é detalhada, facilitando a extração das informações desejadas. Claro, a desvantagem é a mesma deste método: leva tempo e espaço.
3. Resumo
As operações de Jackson no Json são principalmente mostradas acima. Seu método é muito conveniente de usar e muito flexível. Ele fornece operações únicas e operações que podem ler informações sob demanda. E Jackson tem uma gama completa de funções, que podem controlar a serialização e desserialização em vários detalhes, como função de anotação, função de injeção atrasada para Hibernate e função de configuração de formato de hora. Como essas funções não são necessárias no momento, estude-as com cuidado. para mais tarde. Ao mesmo tempo, Jackson também oferece suporte a uma série de operações de serialização e desserialização em XML. A ideia é praticamente a mesma que analisar Json.
Em relação às deficiências atuais do Jackson, algumas pessoas na Internet testaram que ele ocupa mais memória do que o Json-lib. Geralmente vale a pena usar o espaço para o tempo.