JSON工具類選型指南

前言

平時我們在做項目的時候會用到各種有關Json的轉換,現在對於他們的使用有一個總結和整理。


敘述

JSON

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。
它基於ECMAScript的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成爲理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網絡傳輸速率)。

JSON結構

json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種複雜的結構。

1、對象:對象在js中表示爲“{}”括起來的內容,數據結構爲 {key:value,key:value,…}的鍵值對的結構,在面向對象的語言中,key爲對象的屬性,value爲對應的屬性值,所以很容易理解,取值方法爲 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
2、數組:數組在js中是中括號“[]”括起來的內容,數據結構爲 [“java”,“javascript”,“vb”,…],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。
JSON的數據格式的介紹

{“id”:1,”name”:aaa}
[{“id”:1,”name”:aaa},{“id”:2,”name”:bbb}]
{
“city”:{“cid”:1,”cname”:”xxx”}
}

那麼JSON都有哪些呢?請看鏈接

在這裏插入圖片描述


接下來我們就Java中的幾種常用的JSON工具進行分析。

JSON工具類型比較

1.json-lib

json-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確實是依賴於很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar。

對於複雜類型的轉換,json-lib對於json轉換成bean還有缺陷,比如一個類裏面會出現另一個類的list或者map集合,json-lib從json到bean的轉換就會出現問題。
json-lib在功能和性能上面都不能滿足現在互聯網化的需求。

2.開源的Jackson

相比json-lib框架,Jackson所依賴的jar包較少,簡單易用並且性能也要相對高些。
而且Jackson社區相對比較活躍,更新速度也比較快。

Jackson對於複雜類型的json轉換bean會出現問題,一些集合Map,List的轉換出現問題。
Jackson對於複雜類型的bean轉換Json,轉換的json格式不是標準的Json格式

3.Google的Gson

Gson是目前功能最全的Json解析神器,Gson當初是爲因應Google公司內部需求而由Google自行研發而來,但自從在2008年五月公開發布第一版後已被許多公司或用戶應用。

Gson的應用主要爲toJson與fromJson兩個轉換函數,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
而在使用這種對象轉換之前需先創建好對象的類型以及其成員才能成功的將JSON字符串成功轉換成相對應的對象。

類裏面只要有get和set方法,Gson完全可以將複雜類型的json到bean或bean到json的轉換,是JSON解析的神器。
Gson在功能上面無可挑剔,但是性能上面比FastJson有所差距。

4.阿里巴巴的FastJson

Fastjson是一個Java語言編寫的高性能的JSON處理器,由阿里巴巴公司開發。
無依賴,不需要例外額外的jar,能夠直接跑在JDK上。

FastJson在複雜類型的Bean轉換Json上會出現一些問題,可能會出現引用的類型,導致Json轉換出錯,需要制定引用。
FastJson採用獨創的算法,將parse的速度提升到極致,超過所有json庫。

綜上4種Json技術的比較,在項目選型的時候可以使用Google的Gson和阿里巴巴的FastJson兩種並行使用,
如果只是功能要求,沒有性能要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson將bean轉換json確保數據的正確,使用FastJson將Json轉換Bean


工具類具體用法

1.json-lib

maven依賴

  <!-- jsonlib -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

操作實例:

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.xml.XMLSerializer;

import java.util.List;
import java.util.Map;

/**
 * 處理json數據格式的工具類
 *
 * @Classname JsonUtil
 * @Auther sunshinezhang
 * @Date 2019/10/4 20:19
 */
public class JsonUtil {

	/**
	 * 將數組轉換成String類型的JSON數據格式
	 *
	 * @param objects
	 * @return
	 */
	public static String array2json(Object[] objects) {
		JSONArray jsonArray = JSONArray.fromObject(objects);
		return jsonArray.toString();
	}

	/**
	 * 將list集合轉換成String類型的JSON數據格式
	 *
	 * @param list
	 * @return
	 */
	public static String list2json(List list) {
		JSONArray jsonArray = JSONArray.fromObject(list);
		return jsonArray.toString();
	}


	/**
	 * 將map集合轉換成String類型的JSON數據格式
	 *
	 * @param map
	 * @return
	 */
	public static String map2json(Map map) {
		JSONObject jsonObject = JSONObject.fromObject(map);
		return jsonObject.toString();
	}


	/**
	 * 將Object對象轉換成String類型的JSON數據格式
	 *
	 * @param object
	 * @return
	 */
	public static String object2json(Object object){
		JSONObject jsonObject = JSONObject.fromObject(object);
		return jsonObject.toString();
	}



	/**
	 * 將XML數據格式轉換成String類型的JSON數據格式
	 *
	 * @param xml
	 * @return
	 */
	public static String xml2json(String xml){
		JSONArray jsonArray = (JSONArray) new XMLSerializer().read(xml);
		return jsonArray.toString();
	}


	/**
	 * 除去不想生成的字段(特別適合去掉級聯的對象)
	 *
	 * @param excludes
	 * @return
	 */
	public static JsonConfig configJson(String[] excludes){
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setExcludes(excludes);
		jsonConfig.setIgnoreDefaultExcludes(true);
		jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
		return jsonConfig;
	}


}

2.開源的Jackson

maven依賴:

  <!-- jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.3</version>
        </dependency>

操作實例:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import lombok.Data;
import org.junit.Test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Classname JacksonUtil
 * @Auther sunshinezhang
 * @Date 2019/10/5 08:47
 */
public class JacksonUtil {

	// 將Product轉換成json
	@Test
	public void test1() {
		Product p = new Product();
		p.setId(1);
		p.setName("電視機");
		p.setPrice(2000);
		p.setReleaseDate(new Date());

		ObjectMapper mapper = new ObjectMapper();
		mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
		String json = null;
		try {
			json = mapper.writeValueAsString(p);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		System.out.println(json);
	}

    // 將List<Product>轉換成json
	@Test
	public void test2(){
		Product p1 = new Product();
		p1.setId(1);
		p1.setName("電視機");
		p1.setPrice(2000);

		Product p2 = new Product();
		p2.setId(2);
		p2.setName("電冰箱");
		p2.setPrice(3000);

		List<Product> ps = new ArrayList<>();
		ps.add(p1);
		ps.add(p2);

		ObjectMapper mapper = new ObjectMapper();

		// 處理過濾屬性
		//FilterProvider fp = new SimpleFilterProvider().addFilter("productFilter", SimpleBeanPropertyFilter.filterOutAllExcept("id", "name"));
		FilterProvider fp = new SimpleFilterProvider().addFilter("productFilter",
				SimpleBeanPropertyFilter.serializeAllExcept("id", "name"));
		mapper.setFilters(fp);
		String json = null;
		try {
			json = mapper.writeValueAsString(ps);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		System.out.println(json);

	}


	@Data
	public class Product {
		private int id;
		private String name;
		private double price;
		private Date releaseDate;
	}
}

3.Google的Gson

maven依賴

 <!-- gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.3</version>
        </dependency>

操作實例:

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.List;
import java.util.Map;

/**
 *
 * 基於com.google.code.gson封裝的json轉換工具類
 * @Classname GsonUtil
 * @Auther sunshinezhang
 * @Date 2019/10/4 20:30
 */
public class GsonUtil {
	private static Gson gson = null;
	static {
		if (gson==null){
			gson=new Gson();
		}
	}

	private GsonUtil(){}


	/**
	 * 對象轉成json
	 *
	 * @param object
	 * @return json
	 */
	public static String gsonString(Object object){
		String gsonString=null;
		if (gson != null) {
			gsonString = gson.toJson(object);
		}
		return gsonString;
	}

	/**
	 * Json轉成對象
	 *
	 * @param gsonString
	 * @param cls
	 * @return 對象
	 */
	public static <T> T gsonToBean(String gsonString,Class<T> cls){
		T t=null;
		if (gson != null) {
			t = gson.fromJson(gsonString, cls);
		}
		return t;
	}

	/**
	 * json轉成list<T>
	 *
	 * @param gsonString
	 * @param cls
	 * @return list<T>
	 */
	public static <T> List<T> gsonToList(String gsonString,Class<T> cls){
		List<T> list = null;
		if (gson != null) {
			list = gson.fromJson(gsonString, new TypeToken<List<T>>(){}.getType());
		}
		return list;
	}

	/**
	 * json轉成list中有map的
	 *
	 * @param gsonString
	 * @return List<Map<String, T>>
	 */
	public static <T> List<Map<String,T>> gsonToListMaps(String gsonString){
		List<Map<String, T>> list = null;
		if (gson != null) {
			list = gson.fromJson(gsonString, new TypeToken<List<Map<String, T>>>(){}.getType());
		}
		return list;
	}


	/**
	 * json轉成map的
	 *
	 * @param gsonString
	 * @return Map<String, T>
	 */

	public static <T> Map<String,T> gsonToMaps(String gsonString){
		Map<String,T> map=null;
		if (gson != null) {
			map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
			}.getType());
		}
		return map;
	}
}

4.阿里巴巴的FastJson

maven依賴

 <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>

操作實例:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;

import java.util.List;
import java.util.Map;

/**
 * 基於fastjson封裝的json轉換工具類
 *
 * @Classname FastJsonUtils
 * @Auther sunshinezhang
 * @Date 2019/10/5 08:21
 */
public class FastJsonUtil {

	/**
	 * 功能描述:把JSON數據轉換成指定的java對象
	 *
	 * @param jsonData JSON數據
	 * @param clazz    指定的java對象
	 * @return 指定的java對象
	 */
	public static <T> T getJsonToBean(String jsonData, Class<T> clazz) {
		return JSON.parseObject(jsonData, clazz);
	}


	/**
	 * 功能描述:把java對象轉換成JSON數據
	 *
	 * @param object java對象
	 * @return JSON數據
	 */
	public static String getBeanToJson(Object object) {
		return JSON.toJSONString(object);
	}

	/**
	 * 功能描述:把JSON數據轉換成指定的java對象列表
	 * @param jsonData JSON數據
	 * @param clazz 指定的java對象
	 * @return List<T>
	 */
	public static <T> List<T> getJsonToList(String jsonData,Class<T> clazz){
		return JSON.parseArray(jsonData, clazz);
	}

	/**
	 * 功能描述:把JSON數據轉換成較爲複雜的List<Map<String, Object>>
	 * @param jsonData JSON數據
	 * @return List<Map < String, Object>>
	 */

	public static List<Map<String,Object>> getJsonToListMap(String jsonData) {
		return JSON.parseObject(jsonData, new TypeReference<List<Map<String, Object>>>() {
		});
	}

}


小結

對於知識的學習我們應該做到手中無劍,心中無劍的層次。

更多有關Json數據類型轉換的內容,請參考此篇文章。

感謝您的閱讀~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章