Java解析Json字符串--復雜對象
Json示例:
{
"name": "三班",
"students": [
{
"age": 25,
"gender": "female",
"grades": "三班",
"name": "露西",
"score": {
"網絡協議": 98,
"JavaEE": 92,
"計算機基礎": 93
},
"weight": 51.3
},
{
"age": 26,
"gender": "male",
"grades": "三班",
"name": "傑克",
"score": {
"網絡安全": 75,
"Linux操作系統": 81,
"計算機基礎": 92
},
"weight": 66.5
},
{
"age": 25,
"gender": "female",
"grades": "三班",
"name": "莉莉",
"score": {
"網絡安全": 95,
"Linux操作系統": 98,
"SQL數據庫": 88,
"數據結構": 89
},
"weight": 55
}
]
}
我們來解析一下這個Json字符串。
首先, 最外層由一個大括弧”{}”包裹,那麼我們對應的可以建一個實體類來對應,內部有兩個元素,元素name比較明顯是字符串類型的,元素students的值是由一個中括弧”[]”包裹,那麼它對應的應該是一個數組或者列表。
接下來, 我們分析一下中括弧”[]”內部內容格式,中括弧內有三個大括弧包裹著的內容,並且內容格式基本相同,那麼我們可以再定義一個實體類來對應這些大括弧。但是我們發現三個大括弧中的內容還是有些區別的,元素score對應的值雖然都是由一個大括弧來包裹,但是裡邊key的名稱和數量都不相同。這樣的情況我們不能很好的定義一個實體類來對應這個大括弧內的內容,不過我們可以定義一個Map來對應這個大括弧內的內容。
--------------------------------------分割線 --------------------------------------
[譯]JSON數據范式化(normalizr) http://www.linuxidc.com/Linux/2016-02/128288.htm
如何處理JSON中的特殊字符 http://www.linuxidc.com/Linux/2015-09/123067.htm
Struts中異步傳送XML和JSON類型的數據 http://www.linuxidc.com/Linux/2013-08/88247.htm
Linux下JSON庫的編譯及代碼測試 http://www.linuxidc.com/Linux/2013-03/81607.htm
jQuery 獲取JSON數據[$.getJSON方法] http://www.linuxidc.com/Linux/2013-03/81673.htm
用jQuery以及JSON包將表單數據轉為JSON字符串 http://www.linuxidc.com/Linux/2013-01/77560.htm
在C語言中解析JSON配置文件 http://www.linuxidc.com/Linux/2014-05/101822.htm
--------------------------------------分割線 --------------------------------------
最終, 定義出來的實體類如下。
Grades.java
package com.bean;
import java.util.List;
public class Grades {
private String name;//班級名稱
private List<Student> students;//班裡的所有學生
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
Student.java
package com.bean;
import java.util.Map;
/**
* 學生
*/
public class Student {
private int age;//年齡
private String gender;//性別,male/female
private String grades;//班級
private String name;//姓名
private Map<String, Integer> score;//各科分數
private float weight;//體重
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getGrades() {
return grades;
}
public void setGrades(String grades) {
this.grades = grades;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, Integer> getScore() {
return score;
}
public void setScore(Map<String, Integer> score) {
this.score = score;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
}
定義完之後,解析過程就非常簡單了:
package com.test;
import net.sf.json.JSONObject;
import com.bean.Grades;
public class Domain {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"三班\",\"students\":[{\"age\":25,\"gender\":\"female\",\"grades\":\"三班\",\"name\":\"露西\",\"score\":{\"網絡協議\":98,\"JavaEE\":92,\"計算機基礎\":93},\"weight\":51.3},{\"age\":26,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"傑克\",\"score\":{\"網絡安全\":75,\"Linux操作系統\":81,\"計算機基礎\":92},\"weight\":66.5},{\"age\":25,\"gender\":\"female\",\"grades\":\"三班\",\"name\":\"莉莉\",\"score\":{\"網絡安全\":95,\"Linux操作系統\":98,\"SQL數據庫\":88,\"數據結構\":89},\"weight\":55}]}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
Grades grades = (Grades) JSONObject.toBean(jsonObject, Grades.class);
}
}
這個Json字符串有多層嵌套,還有不固定的元素。只要學會了方法,不管多少層也是能分析出來的。