1. 程式人生 > >json和java物件的相互轉換(json-lib和Gson的使用)

json和java物件的相互轉換(json-lib和Gson的使用)

java開發中時常會遇到jsonjava物件轉換的情況,比如說一般介面呼叫返回的都是json格式的,我們要取出來用就得把它解析成我們想要的格式,有時候我們傳遞引數又需要把引數封裝成json。這兩天除錯API經常需要轉換他們,也接觸了兩種解析工具,這裡就簡單的記錄一下。

一:JSON-lib的使用

1.  下載JSON-lib所需要的jar包。下載地址:

2. 如何把java物件封裝成 json

1)建立java物件。

public class Person {
	private String name;
	private int age;
	private String info;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
}

2)建立一個帶main方法的類進行測試。簡單的json構造。

//java物件轉換成json
//建立java物件
Person person=new Person();
person.setName("小周");
person.setAge(20);
person.setInfo("這是一個可愛的小寶寶");
//建立json物件
JSONObject jo=new JSONObject();
jo.put("name",person.getName());
jo.put("age", person.getAge());
jo.put("info", person.getInfo());
//將JSONObject轉換成json。
String json=jo.toString();
System.out.println(json);

得到的結果是:

 

3)構造包含多個json物件和陣列的json

//構造包含多層jsonObject和陣列的接送物件
//構造第二個person JSONObject物件
JSONObject per=new JSONObject();
per.put("name","小劉");
per.put("age", 16);
per.put("info", "這是一個少年");
//構造person JSONObject陣列
List<JSONObject> list=new ArrayList<JSONObject>(); 
list.add(jo);   //jo是上一步創造的json物件
list.add(per);
//構造貓物件
JSONObject cat=new JSONObject();
cat.put("color", "黃色");
cat.put("sex", "公貓");
//構造總物件,其中包括一個person物件和一個cat物件和一組鍵值對
JSONObject anm=new JSONObject();
anm.put("person",list);
anm.put("cat",cat);
anm.put("dog", "這是一隻大狗");
//將JSONObject轉換成json。
String json1=anm.toString();
System.out.println(json1);

結果是:

{"person":[{"name":"小周","age":20,"info":"這是一個可愛的小寶寶"},{"name":"小劉 ","age":16,"info":"這是一個少年"}],"cat":{"顏色":"黃色","性別":"公貓"},"":"這是一 只大狗"}

這裡可以看到,實際上我們可以不不建立一個java類就可以封裝一個json。此外我們我 們可以用jo.put(Map map)方法直接把Map轉換成json

3. 解析jsonjava物件。

/*json轉換成java物件*/
//建立json
String json2=json1;
//解析json jo 1為總json object,由上一步我們知道其中包括一個person JSONObject陣列,一個cat JSONObject物件,一個鍵值對。
JSONObject jo1=JSONObject.fromObject(json2);   
JSONArray PersonArray=(JSONArray) jo1.get("person");  //解析陣列
JSONObject cat1=jo1.getJSONObject("cat");   //解析JSONObject
String dog=jo1.getString("dog");  //解析鍵值對
//對PersonArray進行解析
List<Person> personlist=new ArrayList<Person>();
for(int i=0;i<PersonArray.size();i++){
	JSONObject personObject=(JSONObject) PersonArray.get(i);
	Person p=new Person(); 
	p.setName(personObject.getString("name"));   //string 的解析
	p.setAge(personObject.getInt("age"));   //int的解析
	p.setInfo(personObject.getString("info"));
	personlist.add(p);
}
//cat1的解析
String co=cat1.getString("color");
String sex=cat.getString("sex");
System.out.println("貓的顏色是:"+co+"  性別是"+sex);

輸出結果正確,說明解析成功。

其實我們發現也不必一定要建立java物件才能夠進行解析,完全可以把json解析成單獨的java型別。總之使用json-lib解析或封裝json是完全可以不要封裝java物件這一步驟的。

二:Gson的使用。

如果說json-lib只是單純的對json進行解析和封裝,那麼json就的的確確是jsonjava物件之間的轉換了,它省去了先解析再封裝的過程,只需要一步,就能夠實現jsonjava物件的轉換。

2.匯入jar包,把解壓得到的三個jar全都放到WEB-INF下的lib資料夾中去。

 

這裡還是以剛才得到的上一部分得到的包含陣列和jsonObject物件的複雜json為例

{
    "person": [
        {
            "name": "小周",
            "age": 20,
            "info": "這是一個可愛的小寶寶"
        },
        {
            "name": "小劉",
            "age": 16,
            "info": "這是一個少年"
        }
    ],
    "cat": {
        "color": "黃色",
        "sex": "公貓"
    },
    "狗": "這是一隻大狗"
}

分析json發現有四對{}和一對[],四對{}對應的是總object,兩個person object和一個cat object,兩個person object形成一個person object陣列。所以在java中我們需要建立一個總物件,這個自己隨便命名,就叫anm好了,還要建立一個cat物件,和一個person物件,這兩個物件的名字也可以自己命名,但是最好以對應的{}外邊的名字首字母大寫命名。每個物件的屬性值都要和鍵值對的key保持一致,如果是物件或者陣列或者list,也要和對應的{}前邊的名字或對應[]前邊的名字一樣。總類的屬性是由personlistcat物件和鍵值對的屬性構成。最後的建立結果是:

Person.java

public class Person {
	private String name;
	private int age;
	private String info;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
}

Cat.java

public class Cat {
	private String color;
	private String sex;
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
}

Anm.java

public class Anm {
	private List<Person> person;   //[]前邊的 名字
	private Cat cat;  //{}前邊的名字
	private String dog;   //鍵值對中的key
	public List<Person> getPerson() {
		return person;
	}
	public void setPerson(List<Person> person) {
		this.person = person;
	}
	public Cat getCat() {
		return cat;
	}
	public void setCat(Cat cat) {
		this.cat = cat;
	}
	public String getDog() {
		return dog;
	}
	public void setDog(String dog) {
		this.dog = dog;
	}
	
}

4.Java物件轉換成json.只要按要求建立好java物件,就能很快的轉換成json了。

/*gson轉換java物件為json*/
//建立java物件
Person p1=new Person();     //建立person物件
p1.setName("小周");
p1.setAge(20);
p1.setInfo("這是一個可愛的小寶寶");
Person p2=new Person();
p2.setName("小劉");
p2.setAge(16);
p2.setInfo("這是一個少年");
Cat cat2=new Cat();      //建立cat物件
cat2.setColor("黃色");
cat2.setSex("公貓");
List<Person> list5=new ArrayList<Person>();   //建立person的list
list5.add(p1);
list5.add(p2);
Anm anmm=new Anm();    //建立總物件anm
anmm.setPerson(list5);
anmm.setCat(cat2);
anmm.setDog("這是一隻小花狗");
//把anmm轉換成json
Gson gs=new Gson();
String js=gs.toJson(anmm);
System.out.println(js);

5.json轉換成java物件。

/*gson轉換json為java物件*/
//以上一步得到的json js為例來進行轉換
String json5=js;
//把json5解析成Anm物件
Gson gson=new Gson();
Anm an=gson.fromJson(json5, Anm.class);   
//如果我們需要的是person類的內容
for(int i=0;i<an.getPerson().size();i++){
	System.out.println("解析出來的姓名是"+an.getPerson().get(i).getName());
}

注:構造java物件那一步,如果是java物件轉json的話,那沒什麼好說的,按照需要的建立java物件就好,如果是jsonjava物件,物件的屬性可以不用按照json的格式完全寫完,寫自己需要的就可以,但是如果需要得到裡層{}的值,必須把當前那個{}及其外部的所有{}對應的java物件都建立好。

總結:json-lib幾乎不依賴java物件,而gson完全依賴java物件,所以我們一般不用到java物件或者需要構造的java物件很簡單的時候採用json-lib比較方便,而當json很複雜,得到的資料還需要封裝的時候用gson比較省時省力。