JackSon框架解析Json

一、简介

  Jackson解析的速度算是同类框架中最快的,同时也是Spring MVC中内置使用的解析方式

  Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。

二、JackSon的使用

  Jackson提供了很多类和方法,而在序列化和反序列化中使用的最多的类则是ObjectMapper这个类,此类比较类似于Json-lib中JsonObject和ArrayObject。此类中提供了readTree(),readValue(),writeValueAsString()等方法用于转换。具体关于此类的说明文档地址是:http://tool.oschina.net/uploads/apidocs/jackson-1.9.9/org/codehaus/jackson/map/ObjectMapper.html

  下面中所涉及到的objectMapper均是来至于ObjectMapper objectMapper = new ObjectMapper()。

1、导入jar包

//maven公共直接导入依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>

2、创建Object类

/*例如创建一个雇员类*/
public
class Employee { private int id; private String name; private int age;
 ...省略getter、setter
}

 Json格式的文件data.json如下:

{
"id" : 123,
"name" : "Henry Smith",
"age" : 28,
"salary" : 2000
}

1、通过文件将Json与对象相互转换

public void testJsonToObject() throws JsonParseException, JsonMappingException, IOException{
        ObjectMapper objectMapper = new ObjectMapper();
     //将json格式数据从文件读入,并转换为对象 Employee emp
= objectMapper.readValue(new File("src/data.json"), Employee.class); System.out.println(emp.toString()); } public void testObjectTojson() throws JsonParseException, JsonMappingException, IOException{ ObjectMapper objectMapper = new ObjectMapper(); Employee emp = objectMapper.readValue(new File("src/data.json"), Employee.class); //将对象转化为json格式,并存入到文件中 objectMapper.writeValue(new File("src/data1.json"), emp); //将对象转化为json格式数据,并输出到控制台上 objectMapper.writeValue(System.out, emp);

 

2、通过I/O流将Json与对象相互转换

public void testInputStream() throws JsonParseException, JsonMappingException, IOException{
     //创建ObjectMapper对象 ObjectMapper objectMapper
= new ObjectMapper();
     //将json格式数据从文件读入,并转换为对象 Employee emp
= objectMapper.readValue(new FileInputStream("src/data.json"), Employee.class); System.out.println(emp.toString()); }

public void testOutPutStream() throws JsonParseException, JsonMappingException, IOException{ ObjectMapper objectMapper = new ObjectMapper(); Employee emp = objectMapper.readValue(new File("src/data.json"), Employee.class); //将对象转化为json格式,并存入到文件中 objectMapper.writeValue(new FileOutputStream("src/data1.json"), emp);

 3、从URL中读取数据(若URL返回的满足Employee类的json数据)

Employee emp1 = objectMapper.readValue("http://www.xxx.com/xxx", Employee.class);
JsonNode jsonNode = objectMapper.readTree("http://www.xxx.com/xxx");

 

4、常用方法

  可通过ObjectMapper类实现Json格式数据与Object转换

类ObjectMapper:此映射器(或数据绑定器或编解码器)提供了在Java对象(JDK提供的核心类,bean的实例)和匹配的JSON构造之间进行转换的功能。它将使用JsonParserJsonGenerator 实现JSON的实际读/写实例。

<T>T    readValue(File src, Class<T> valueType) 

<T>T    readValue(InputStream src, Class<T> valueType)

JsonNode  readTree(URL source)将JSON内容反序列化为使用JsonNode实例集表示的树的方法

void    writeValue(File resultFile, Object value)将Object输出为JSON到File文件中

void    writeValue(OutputStream out, Object value)

void    writeValue(Writer w, Object value)

String   writeValueAsString(Object value)可用于将任何Java值序列化为String的方法。

TypeFactory  getTypeFactory()用于获取当前配置TypeFactory实例的访问器。

 

类TypeFactory:final修饰,从Jackson 1.8开始,JavaType给定各种输入时用于创建具体实例的类。应该使用通过ObjectMapper(并通过DeserializationConfig和 公开 SerializationConfig)配置的实例来完成使用

JavaType  constructParametricType(Class<?> parametrized, Class<?>... parameterClasses)用于构造的工厂方法JavaType表示参数化类型。

JavaType  constructParametricType(Class<?> parametrized, JavaType... parameterTypes)用于构造的工厂方法JavaType表示参数化类型。

 

更多ObjectMapper的API详见:http://tool.oschina.net/uploads/apidocs/jackson-1.9.9/org/codehaus/jackson/map/ObjectMapper.html

 更多TypeFactory的API详见:http://tool.oschina.net/uploads/apidocs/jackson-1.9.9/org/codehaus/jackson/map/type/TypeFactory.html

 代码实例,可抽取为JsonUtils

package com.example;

import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 
 */
public class JsonUtils {

    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 将对象转换成json字符串。
     * <p>Title: pojoToJson</p>
     * <p>Description: </p>
     * @param data
     * @return
     */
    public static String objectToJson(Object data) {
        try {
            String string = MAPPER.writeValueAsString(data);
            return string;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将json结果集转化为对象
     * 
     * @param jsonData json数据
     * @param clazz 对象中的object类型
     * @return
     */
    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
        try {
            T t = MAPPER.readValue(jsonData, beanType);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将json数据转换成pojo对象list
     * <p>Title: jsonToList</p>
     * <p>Description: </p>
     * @param jsonData
     * @param beanType
     * @return
     */
    public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
        JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
        try {
            List<T> list = MAPPER.readValue(jsonData, javaType);
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }
    
}
View Code

 

posted @ 2018-11-14 21:16  turbosha  阅读(2951)  评论(0编辑  收藏  举报