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)); } }