【JavaEE學習筆記】JSON解析_原生JSON,GSON,FastJSON

JSON解析

A.JSON介紹

1.概述

一種簡單的數據格式,比xml更輕巧

是JS的原生格式,這意味着在JS中處理JSON數據不需要任何特殊的工具包

JSON採用完全獨立於語言的文本格式,使JSON成爲理想的數據交換語言

易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網絡傳輸速率)、

是目前網絡中主流的數據傳輸格式之一,應用十分廣泛

2.JSON數據結構

a.對象(JsonObject)

表示"{}"括起來的內容,結構爲:{key:value,key:value,...}鍵值對

key必須是String類型,value可以使任意數據類型

b.數組(JsonArray)

表示"[]"括起來的內容,是有序的,結構爲[value,value...]的單值結構

3.JSON與XML的區別

JSON是一種取代XML的數據結構,和xml相比,更小巧,傳輸更快


4.下面數據用xml和JSON表示

a.xml

<?xml version="1.0" encoding="UTF-8"?>
  <country>
    <name>中國</name>
    <provinces>
       <province>
          <pNname>河南</pNname>
       </province>
       <province>
          <pNname>山西</pNname>
       </province>
     </provinces>
 </country>

b.JSON

{'name':'中國','provinces':[{'pName':'河南'},{'pName':'山西'}]}

B.JSON

1.Jar包

JSON-lib包:是一個beans,collections,maps, arrays 和JSON互相轉換的工具包

除了json-lib外還依賴

commons-lang

commons-beanutils 

commons-collections 

commons-logging 

ezmorph


2.轉換成對象

a.JSONObject.toBean(); json對象格式字符串轉換成javabean

獲取json對象指定屬性值:String id = jsonObj.getString("id");

{'id':110,'name':'zhangsan','sex':'male','age':18}

1)JavaBean:Student

(分析JavaBean,解析的主要部分,成員變量名要和一樣json對象一樣)

package org.xxxx.json.bean;

public class Student {
	private String id;
	private String name;
	private String sex;
	private String age;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(String id, String name, String sex, String age) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	public String getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}

}

2)轉換測試類

package org.xxxx.json;

import org.xxxx.json.bean.Student;

import net.sf.json.JSONObject;

public class Demo01 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "{'id':110,'name':'zhangsan','sex':'male','age':18}";
		
		// 轉換爲JSONObject對象
		JSONObject jsonObject = JSONObject.fromObject(str);
		
		// 轉換爲JavaBean
		Student stu = (Student) JSONObject.toBean(jsonObject, Student.class);
		
		// 輸出
		System.out.println(stu);
		
		// 獲取單個對象:id
		String id = jsonObject.getString("id");
		System.out.println("id = " + id);
		
	}
}

b.JSONArray.toCollection();Json數組格式轉換成對象

     獲取jsonArray中指定的jsonObject:JSONObject obj = array.getJSONObject(0);

測試代碼

package org.xxxx.json;

import java.util.Collection;

import org.xxxx.json.bean.Student;

import net.sf.json.JSONArray;

public class Demo02 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "[{'id':110,'name':'zhangsan','sex':'male','age':18},{'id':120,'name':'lisi','sex':'female','age':28}]";
		
		// 轉換爲JSONOArray
		JSONArray jsonArray = JSONArray.fromObject(str);
		
		// 轉換爲集合對象
		Collection<Student> c = JSONArray.toCollection(jsonArray, Student.class);
		
		System.out.println(c);
		
		// 獲取第二個數組id:120
		String id = jsonArray.getJSONObject(1).getString("id");
		System.out.println("id  = " + id);

	}
}

c.混合式json解析,結合JSONObject和JSONArray裏方法實現

{'us':[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]}

測試代碼

package org.xxxx.json;

import java.util.Collection;

import org.xxxx.json.bean.Student;

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

public class Demo03 {
	public static void main(String[] args) {
		// 定義字符串
		// 是個對象,us爲鍵,值爲數組
		String str = "{'us':[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]}";
		
		// 轉換爲JSONObject
		JSONObject fromObject = JSONObject.fromObject(str);
		
		// 根據key獲取JSONArray
		JSONArray jsonArray = fromObject.getJSONArray("us");
		
		// 轉爲集合
		Collection<Student> c = jsonArray.toCollection(jsonArray, Student.class);
		
		System.out.println(c);

	}
}

d.JSONObject.toBean的時候如果轉換的類中有集合

{'name':'中國','provinces':[{'pName':'河南'},{'pName':'山西'}]}

可以先定義Map<String, Class> map;

在map中put你要轉換的類中的集合屬性名和轉換後類class

然後在toBean()的時候把參數加上

1)建一個Provinces Bean

package org.xxxx.json.bean;

public class Province {
	private String pName;

	public Province() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Province(String pName) {
		super();
		this.pName = pName;
	}

	public String getpName() {
		return pName;
	}

	public void setpName(String pName) {
		this.pName = pName;
	}

	@Override
	public String toString() {
		return "Province [pName=" + pName + "]";
	}

}

2)建一個Country Bean

package org.xxxx.json.bean;

import java.util.List;

public class Country {
	private String name;
	private List<Province> provinces;

	public Country() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Country(String name, List<Province> provinces) {
		super();
		this.name = name;
		this.provinces = provinces;
	}

	public String getName() {
		return name;
	}

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

	public List<Province> getProvinces() {
		return provinces;
	}

	public void setProvinces(List<Province> provinces) {
		this.provinces = provinces;
	}

	@Override
	public String toString() {
		return "Country [name=" + name + ", provinces=" + provinces + "]";
	}

}

3)測試類

package org.xxxx.json;

import java.util.HashMap;
import java.util.Map;

import org.xxxx.json.bean.Country;
import org.xxxx.json.bean.Province;

import net.sf.json.JSONObject;

public class Demo04 {
	public static void main(String[] args) {
		// 定義字符串
		// 一個對象:name和provinces爲鍵,後者的值爲一個集合
		String str = "{'name':'中國','provinces':[{'pName':'河南'},{'pName':'山西'}]}";

		// 轉換爲JSONObject
		JSONObject fromObject = JSONObject.fromObject(str);

		// 集合屬性和其中的javabean對應關係
		Map<String, Class<Province>> map = new HashMap<String, Class<Province>>();
		map.put("provinces", Province.class);
		
		// 轉換爲bean
		Country cou = (Country) JSONObject.toBean(fromObject, Country.class);
		System.out.println(cou);
	}
}

3.對象轉換成JSON

a.使用JSONObject.fromObject()方法;集合對象使用JSONArray.fromObject()方法

package org.xxxx.json;

import java.util.ArrayList;
import java.util.List;

import org.xxxx.json.bean.Student;

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

public class Demo05 {
	public static void main(String[] args) {
		// 創建對象
		Student stu = new Student("10", "張三", "男", "20");
		
		// 轉換成JSON
		String str1 = JSONObject.fromObject(stu).toString();
		System.out.println(str1);
		
		// 創建集合
		List<Student> list = new ArrayList<Student>();
		
		// 添加集合
		list.add(stu);
		
		// 轉換
		String str2 = JSONArray.fromObject(list).toString();
		System.out.println(str2);
	}
}

b.使用JSONSerializer.toJSON()方法

package org.xxxx.json;

import java.util.ArrayList;
import java.util.List;

import org.xxxx.json.bean.Student;

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

public class Demo05 {
	public static void main(String[] args) {
		// 創建對象
		Student stu = new Student("10", "張三", "男", "20");
		
		// 轉換成JSON
		String str1 = JSONSerializer.toJSON(stu).toString();
		System.out.println(str1);
		
		// 創建集合
		List<Student> list = new ArrayList<Student>();
		
		// 添加集合
		list.add(stu);
		
		// 轉換
		String str2 = JSONSerializer.toJSON(list).toString();
		System.out.println(str2);
	}
}

C.GSON

1.概述

是Google提供的json轉換jar


2.將json轉換成bean

a.簡單的object類型

{'name':'zhangsan','age':20}

package org.xxxx.gson;

import org.xxxx.gson.bean.Student;

import com.google.gson.Gson;

public class Demo01 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "{'name':'zhangsan','age':20}";
		
		// 創建Gson
		Gson gson = new Gson();
		
		// 轉換 不用強轉
		Student stu = gson.fromJson(str, Student.class);
		System.out.println(stu);
	}
}

(注意:直接轉換則成員屬性的名稱必須與Json數據的key一致)

b.解析結果爲List

[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]

package org.xxxx.gson;

import java.lang.reflect.Type;
import java.util.List;

import org.xxxx.gson.bean.Student;

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

public class Demo02 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]";
		
		// 創建Gson
		Gson gson = new Gson();
		
		// 使用Type類型參數:告知返回集合中元素的類型
		Type type = new TypeToken<List<Student>>(){}.getType();
		
		// 轉換
		List<Student> list = gson.fromJson(str, type);
		
		System.out.println(list);
	}
}

c.{'name':'中國','provinces':[{'pName':'河南'},{'pName':'山西'}]}

package org.xxxx.gson;

import org.xxxx.gson.bean.Country;

import com.google.gson.Gson;

public class Demo03 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "{'name':'中國','provinces':[{'pName':'河南'},{'pName':'山西'}]}";
		
		// 創建Gson
		Gson gson = new Gson();
		
		// 轉換
		Country c = gson.fromJson(str, Country.class);
		
		System.out.println(c);
	}
}

d.{'us':[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]}

1)創建JavaBean,放集合

package org.xxxx.gson.bean;

import java.util.List;

public class StudentInfo {
	private List<Student> us;

	public StudentInfo() {
		super();
		// TODO Auto-generated constructor stub
	}

	public StudentInfo(List<Student> us) {
		super();
		this.us = us;
	}

	public List<Student> getUs() {
		return us;
	}

	public void setUs(List<Student> us) {
		this.us = us;
	}

	@Override
	public String toString() {
		return "StudentInfo [us=" + us + "]";
	}

}

2)測試類

package org.xxxx.gson;

import org.xxxx.gson.bean.StudentInfo;

import com.google.gson.Gson;

public class Demo04 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "{'us':[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]}";

		// 創建Gson
		Gson gson = new Gson();

		// 轉換
		StudentInfo info = gson.fromJson(str, StudentInfo.class);

		System.out.println(info);
	}
}

3.對象轉換成json字符串

使用Gson對象的toJson()方法即可,參數是任意對象

package org.xxxx.gson;

import java.util.ArrayList;
import java.util.List;

import org.xxxx.gson.bean.Student;
import org.xxxx.gson.bean.StudentInfo;

import com.google.gson.Gson;

public class Demo05 {
	public static void main(String[] args) {
		// 創建集合對象
		List<StudentInfo> list = new ArrayList<StudentInfo>();
		
		// 添加兩個對象
		for (int i = 0; i < 2; i++) {
			// 創建對象
			StudentInfo si = new StudentInfo();
			List<Student> l  = new ArrayList<Student>();
			
			// 遍歷添加
			for (int j = 0; j < 2; j++) {
				Student s = new Student();
				s.setId("1" + j);
				s.setName("stu" + j);
				s.setAge("10" + j);
				s.setSex("男");
				l.add(s);
			}
			// 添加到si對象
			si.setUs(l);
			
			// 添加集合
			list.add(si);
		}
		
		// 創建Gson
		Gson gson = new Gson();
		
		// 轉換
		String str = gson.toJson(list);
		System.out.println(str);
	}
}

D.FastJSON

1.概述

是一個性能很好的 Java 語言實現的 JSON 解析器和生成器

來自阿里巴巴的工程師開發

Fastjson API入口類是com.alibaba.fastjson.JSON

常用的序列化操作都可以在JSON類上的靜態方法直接完成


2.特點

快速FAST (比其它任何基於Java的解析器和生成器更快,包括jackson)

強大(支持普通JDK類包括任意Java Bean Class、Collection、Map、Date或enum)

零依賴(沒有依賴其它任何類庫除了JDK)

3.將json對象轉換成我們需要的數據對象

a.普通object格式轉換爲對象

{'id':110,'name':'zhangsan','sex':'male','age':18}

package org.xxxx.fastjson;

import org.xxxx.gson.bean.Student;

import com.alibaba.fastjson.JSON;

public class Demo01 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "{'id':110,'name':'zhangsan','sex':'male','age':18}";
		
		// 轉換
		Student stu = JSON.parseObject(str, Student.class);
		
		System.out.println(stu);
	}
}

b.數組格式轉換爲集合

[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]

package org.xxxx.fastjson;

import java.util.List;

import org.xxxx.gson.bean.Student;

import com.alibaba.fastjson.JSON;

public class Demo02 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]";
		
		// 解析
		List<Student> list = JSON.parseArray(str, Student.class);
		
		System.out.println(list);
	}
}

c.{'us':[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]}

package org.xxxx.fastjson;

import org.xxxx.gson.bean.StudentInfo;

import com.alibaba.fastjson.JSON;

public class Demo03 {
	public static void main(String[] args) {
		// 定義字符串
		String str = "{'us':[{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]}";
		
		// 轉換
		StudentInfo info = JSON.parseObject(str, StudentInfo.class);
		
		System.out.println(info);
	}
}

4.對象轉換爲json字符串

a.普通字符串 JSON.toJSONString(s);

b.格式字符串 JSON.toJSONString(s,true);

package org.xxxx.fastjson;

import java.util.ArrayList;
import java.util.List;

import org.xxxx.gson.bean.Student;
import org.xxxx.gson.bean.StudentInfo;

import com.alibaba.fastjson.JSON;

public class Demo04 {
	public static void main(String[] args) {
		// 定義集合
		List<StudentInfo> list = new ArrayList<StudentInfo>();
		
		// 添加數據
		for (int i = 0; i < 2; i++) {
			StudentInfo si = new StudentInfo();
			List<Student> l = new ArrayList<Student>();
			for (int j = 0; j < 2; j++) {
				Student s = new Student();
				s.setId("1" + j);
				s.setName("stu" + j);
				s.setSex("男");
				s.setAge("20" + j);
				l.add(s);
			}
			
			si.setUs(l);
			list.add(si);
		}
		
		// 轉換
		System.out.println(JSON.toJSONString(list));
		System.out.println(JSON.toJSONString(list, true));
	}
}
發佈了106 篇原創文章 · 獲贊 135 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章