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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM