Json數據的序列化與反序列化的三種常用方法介紹

以下內容是本作者從官網中看相應的教程後所做的demo,其體現瞭作者對相關知識點的個人理解。。作者才疏學淺,難免會有理解不到位的地方。。還請各位讀者批判性對待。。。

本文主要介紹在Json數據的序列化與反序列化的過程中我經常用到的三種工具的基本使用方法,及其他們之間

的比較。。。希望能夠對讀者們有一些幫助。。。

這裡介紹到的三種解析與生成Json數據的方法分別是:標準JSON解析與生成方法、使用gson解析與生成JSON數據

、使用fastJsson解析與生成JSON數據。

首先,這些工具都可以到相應的官網中下載。以下給出我所用到的jar包的下載鏈接:

1)標準JSON所用到的jar包:https://download.csdn.net/detail/caihongshijie6/6701285

2)gson所用到的jar包:https://download.csdn.net/detail/caihongshijie6/7260481

3)fastjson所用到的jar包:https://download.csdn.net/detail/caihongshijie6/7260485

一、對於JSON數據的描述

JSON是一種輕量級的數據交換格式(個人認為在很多方面上,其優於XML)。我個人將其數據形式總結如下:

{}表示一個對象,以 鍵:值 對的形式給出對象的內部成員及成員變量的值。多個內部成員之間用 逗號,來隔開。

集合和數組都用[]來表示。

更詳盡的關於JSON的描述請參考其官網:https://www.json.org/ (裡面也有各種各樣的解析工具)

二、使用標準JSON的解析與生成方法

1、首先寫一個我們會用到的pojo類

public class Person {

	private int id;
	private String name;
	private String address;
	
	public Person() {
		
	}

	public Person(int id, String name, String address) {
		super();
		this.id = id;
		this.name = name;
		this.address = address;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", address=" + address
				+ "]";
	}
	
	
	
}

2、使用標準JSON進行生成與解析

package com.njupt.pojo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Main {

	public static void main(String[] args) {
		
		/**
		 * 生成JSON字符串
		 * 
		 */
		//對象
		Person person = new Person(1, "haungjundong","beijing");
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("hjd", person);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		
		//基本數據類型
		jsonObject.put("int", 123);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		jsonObject.put("string", "hello world");
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		//數組
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		jsonObject.put("arr", arr);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		/**
		 * 生成集合類型數據(1)
		 * 為什麼不使用List來距離呢???
		 * 因為"基本類型的集合"已經有一種形式來表示瞭:-------->數組
		 * 如果一定要的話,輕易List,然後做一個demo
		 */
		List strList = new ArrayList();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		jsonObject.put("strList", strList);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");
		
		//生成集合類型數據(2)
		List personList = new ArrayList();
		for(int i = 0 ; i JSON對象中的key必須是一個String類型的(字符串)
		 * 
		 * 2)對於下面,可以這樣理解(可能有一點不太準確,但是方便理解)
		 * map是一個對象,key為其內部成員,value是key的值
		 */
		List mapList = new ArrayList();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap();
			map.put("" + i, 10+i);
			
			mapList.add(map);
		}
		jsonObject.put("mapList", mapList);
		System.out.println("--------------");
		System.out.println(jsonObject.toString());
		System.out.println("--------------");
		

		System.out.println("------------------->解析json字符串");
		String jsonString = jsonObject.toString();//將jsonObject轉換成json字符串
		
		
		JSONObject jsonObject2 = JSONObject.fromObject(jsonString);//利用json字符串生成json對象
		
		//解析Person對象
		Person person2 = new Person();
		
//		JSONObject personObject = (Person) jsonObject2.get("hjd");//*****這種寫法是錯的,原生的json的解析方法並不支持將json字符串自動轉成相應的對象...
		JSONObject personObject = (JSONObject) jsonObject2.get("hjd");//第一種寫法
//		JSONObject personObject = jsonObject2.getJSONObject("hjd");//第二種寫法
		person2.setId(personObject.getInt("id"));
		person2.setName(personObject.getString("name"));
		person2.setAddress(personObject.getString("address"));
		System.out.println("--------------->person2: " + person2);
		
//		System.out.println("person2.getId(): " + person2.getId() + ",person2.getAddress(): " + person2.getAddress() + ",person2.getName()" + person2.getName());

		//解析基本數據類型
		int num = jsonObject2.getInt("int");
//		System.out.println("---->num: " + num);
		
		
		//解析基本類型的數組數組
		JSONArray arrArray = jsonObject2.getJSONArray("arr");
		int size = arrArray.size();
		int arr2[] = new int[size];
		for(int i = 0 ; i < size ; ++i){
			arr2[i] = arrArray.getInt(i);
		}
//		System.out.println(Arrays.toString(arr2));
		
		//解析List
		JSONArray strArray = jsonObject2.getJSONArray("strList");
		List strList2 = new ArrayList();
		int size2 = strArray.size();
		for(int i = 0 ; i " + strList2);
		
		
		//解析List
		JSONArray personArray = jsonObject2.getJSONArray("personList");
		List personList2 = new ArrayList();
		int size3 = personArray.size();
		for(int i = 0 ; i" + personList2);
		
		
		//解析List
		JSONArray mapArray = jsonObject2.getJSONArray("mapList");
		List mapList2 = new ArrayList();
		int size4 = mapArray.size();
		for(int i = 0 ; i < size4 ; ++i){
			JSONObject jo = mapArray.getJSONObject(i);
			Map m = new HashMap();
			m.put("" + i, jo.getInt("" + i));
			
			mapList2.add(m);
		}
		System.out.println("--------------->" + mapList2);
	}
}

小結一下:使用標準JSON進行解析時,主要用到的API如下:

生成:

Person person = new Person(1, "haungjundong","beijing");
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("hjd", person);

解析時:舉例如下

[]:jsonObject2.getJSONArray(“arr”);

{}:jsonObject2.getJSONObject(“hjd”);

基本數據類型:jsonObject2.getInt(“int”);

jsonObject.toString() —->>將json對象轉換成json格式的字符串

JSONObject jsonObject2 = JSONObject.fromObject(jsonString); ——–>>利用json字符串生成json對象

二、使用gson進行生成與解析

1、Person類的代碼同上

2、使用gson進行生成與解析

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;


public class Main {

	public static void main(String[] args) {
		
		/**
		 * 使用gson來生成JSON字符串
		 */
		//對象
		Person person = new Person(1, "haungjundong","beijing");
		
		Gson gson = new Gson();
		String personStr = gson.toJson(person);
//		System.out.println( "----------->" + personStr);
		
		Person person2 = gson.fromJson(personStr, Person.class);
//		System.out.println("------>person2: " + person2);
		
		//數組
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		String arrStr = gson.toJson(arr);
//		System.out.println(arrStr);
		
		int arr2[] = gson.fromJson(arrStr,int[].class);//****這是要註意的地方之一..
//	    System.out.println(Arrays.toString(arr2));
		
		
		/**
		 * 生成集合類型數據(1)
		 * 
		 * 無論是List還是List還是List
		 * 其利用json字符串生成對象的時候,其類型都是List.class
		 */
		List strList = new ArrayList();
		for(int i = 0 ; i " + strListStr);
		
		List strList2 = gson.fromJson(strListStr, List.class);
//		System.out.println(strList2);
		
		//生成集合類型數據(2)
		List personList = new ArrayList();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		String personListJsonStr = gson.toJson(personList);
//		System.out.println(personListJsonStr);
		
		List personList2 = gson.fromJson(personListJsonStr, List.class);
		/**
		 * [{id=0.0, name=hjd0, address=beijing0}, {id=1.0, name=hjd1, address=beijing1}, {id=2.0, name=hjd2, address=beijing2}, {id=3.0, name=hjd3, address=beijing3}, {id=4.0, name=hjd4, address=beijing4}, {id=5.0, name=hjd5, address=beijing5}, {id=6.0, name=hjd6, address=beijing6}, {id=7.0, name=hjd7, address=beijing7}, {id=8.0, name=hjd8, address=beijing8}, {id=9.0, name=hjd9, address=beijing9}]
		 */
//		System.out.println(personList2);
		
		/**
		 * 生成集合類型數據(3)
		 * 
		 * 1)
		 * Caused by: java.lang.ClassCastException: 
		 * JSON keys must be strings.------->JSON對象中的key必須是一個String類型的(字符串)
		 * 
		 * 2)對於下面,可以這樣理解(可能有一點不太準確,但是方便理解)
		 * map是一個對象,key為其內部成員,value是key的值
		 */
		List mapList = new ArrayList();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap();
			map.put("" + i, 10+i);
			
			mapList.add(map);
		}
		String mapListJsonStr = gson.toJson(mapList);
//		System.out.println(mapListJsonStr);
	
		List mapList2 = gson.fromJson(mapListJsonStr, List.class);
//		System.out.println(mapList2);
	}
}

小結:

1)生成JSON數據:舉例

Gson gson = new Gson();
String personStr = gson.toJson(person);

2)解析JSON數據:舉例

Person person2 = gson.fromJson(personStr, Person.class);

Person person2 = gson.fromJson(personStr, Person.class);

特別需要註意的是:

基本類型數據的解析方式: int[].class

List類型數據的解析方式: List.class (無論是List還是List還是,List都是用的是這個)

其實大傢可以發現,我們在生成與解析的時候隻是調一下gson這個對象的方法而已。除此之外,專門生成一個

gson對象似乎沒有什麼用。。。

是的,我是這麼認為的。我想阿裡巴巴的那幫哥們也是這麼想的。所以在對性能進行進一步優化的同時,他們

把解析的方法對做成靜態的瞭。。。這樣就不需要專門生成一個對象才能使用相應的方法

三、使用fastjson進行生成與解析

1、Person類的代碼是一樣的

2、

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;



public class Main {

	public static void main(String[] args) {
		
		/**
		 * 使用gson來生成JSON字符串
		 */
		//對象
		Person person = new Person(1, "haungjundong","beijing");
		String personStr = JSON.toJSONString(person);//利用對象生成JSON字符串
//		System.out.println(personStr);
		Person person2 = JSON.parseObject(personStr, Person.class);//利用JSON字符串生成Person對象
//		System.out.println(person2);
		
		
		//數組
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		String arrStr = JSON.toJSONString(arr);
//		System.out.println(arrStr);
		int arr2[] = JSON.parseObject(arrStr, int[].class);
//		System.out.println(Arrays.toString(arr2));
		
		/**
		 * 生成集合類型數據(1)
		 * 
		 * 無論是List還是List還是List
		 * 其利用json字符串生成對象的時候,其類型都是List.class
		 */
		List strList = new ArrayList();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		String strListJSONStr = JSON.toJSONString(strList);
//		System.out.println(strListJSONStr);
		List strList2 = JSON.parseObject(strListJSONStr, List.class);
//		System.out.println(strList2);
		
		//生成集合類型數據(2)
		List personList = new ArrayList();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		String personListJSONStr = JSON.toJSONString(personList);
		/**
		 * 以下語句的打印結果
		 * [{"address":"beijing0","id":0,"name":"hjd0"},{"address":"beijing1","id":1,"name":"hjd1"},{"address":"beijing2","id":2,"name":"hjd2"},{"address":"beijing3","id":3,"name":"hjd3"},{"address":"beijing4","id":4,"name":"hjd4"},{"address":"beijing5","id":5,"name":"hjd5"},{"address":"beijing6","id":6,"name":"hjd6"},{"address":"beijing7","id":7,"name":"hjd7"},{"address":"beijing8","id":8,"name":"hjd8"},{"address":"beijing9","id":9,"name":"hjd9"}]
		 */
//		System.out.println(personListJSONStr);
		List personList2 = JSON.parseObject(personListJSONStr, List.class);
		/**
		 * 以下語句的打印結果
		 * [Person [id=0, name=hjd0, address=beijing0], Person [id=1, name=hjd1, address=beijing1], Person [id=2, name=hjd2, address=beijing2], Person [id=3, name=hjd3, address=beijing3], Person [id=4, name=hjd4, address=beijing4], Person [id=5, name=hjd5, address=beijing5], Person [id=6, name=hjd6, address=beijing6], Person [id=7, name=hjd7, address=beijing7], Person [id=8, name=hjd8, address=beijing8], Person [id=9, name=hjd9, address=beijing9]]
		 */
//		System.out.println(personList);
		
		/**
		 * 生成集合類型數據(3)
		 * 
		 * 1)
		 * Caused by: java.lang.ClassCastException: 
		 * JSON keys must be strings.------->JSON對象中的key必須是一個String類型的(字符串)
		 * 
		 * 2)對於下面,可以這樣理解(可能有一點不太準確,但是方便理解)
		 * map是一個對象,key為其內部成員,value是key的值
		 */
		List mapList = new ArrayList();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap();
			map.put("" + i, 10+i);
			
			mapList.add(map);
		}
		String mapListJSONStr = JSON.toJSONString(mapList);
//		System.out.println(mapListJSONStr);
		List mapList2 = JSON.parseObject(mapListJSONStr, List.class);
//		System.out.println(mapList2);
		
	}
}

小結:

1)生成JSON格式的數據

JSON.toJSONString(person);//利用對象生成JSON字符串

2)解析JSON格式的數據

JSON.parseObject(arrStr, int[].class);

註意:

fastjson與gson的使用方式很像。但是在一些細節方面上還是用有區別的。這些細節上的差別在服務器與客戶端的數據進行交互的時候可能產生的影響是很大的。還請各位讀者認真思考在使用。個人比較傾向於使用fastjson,個人認為他在一些細節方面處理得要比google的gson處理得好。。。

四、三者之間的比較

標準JSON的生成與解析方法與gson、fastjson之間最大的區別就在於:標準JSON的生成與解析方法無法利用JSON

數據自動生成相應的對象和數據。使用標準JSON進行生成相應的對象時,隻能是一個一個的獲取器成員變量的數據,然後一個一個地set()。。

五、寫在最後

更多的隻是還請各位讀者到相應的官網去查找相應的教程。。如果有錯誤還請多多包涵並且批評指出(不要吐槽的太厲害哈~~~~吐舌頭)

六、源碼下載

https://download.csdn.net/detail/caihongshijie6/7260637

發佈留言