GSON是谷歌提供的開源庫,用來解析Json格式的數(shù)據(jù),非常好用。如果要使用GSON的話,則要先下載gson-2.2.4.jar
這個(gè)文件,如果是在Android項(xiàng)目中使用,則在Android項(xiàng)目的libs目錄下添加這個(gè)文件即可;如果是在Java項(xiàng)目中,則把gson-2.2.4.jar先添加到當(dāng)前項(xiàng)目的任意一個(gè)包中,然后右鍵點(diǎn)擊這個(gè)jar包 -> 構(gòu)建路徑 -> 添加至構(gòu)建路徑。這樣準(zhǔn)備工作就做好了。
(一)單條無嵌套Json數(shù)據(jù)的解析
比如有如下Json數(shù)據(jù):{"name":"John", "age":20}
注:也可以用單引號(hào),寫成:{'name':'John', 'age':20}
解析該數(shù)據(jù)步驟如下:
- 1、定義Person類:
public class Person{
private String name; //屬性都定義成String類型,并且屬性名要和Json數(shù)據(jù)中的鍵值對(duì)的鍵名完全一樣
private String age;
...//提供所有屬性的getter和setter方法
}
- 2、創(chuàng)建GSON對(duì)象并解析:
String jsonData = "{\"name\":\"John\", \"age\":20}"; //注:這里也可以不使用轉(zhuǎn)義字符,而用單引號(hào):String jsonData = "{'name':'John', 'age':20}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonData,Person.class);
3、然后使用Person對(duì)象的getter方法就可以獲取到數(shù)據(jù)了。
4、擴(kuò)展:考慮到Json數(shù)據(jù)的不同,那么解析Json的時(shí)候所用的類也可能不同,比如這里用的是Person,如果解析其他數(shù)據(jù)可能用的又是Dog、Cat...所以考慮將用GSON解析的步驟封裝,并提供泛型參數(shù),示例程序如下:
import com.google.gson.Gson;
/**
* 用GSON解析單條Json數(shù)據(jù)
*
*/
public class GsonTest1 {
public static void main(String[] args) {
String jsonData = "{'name':'John', 'age':20}";
Person person = GsonUtil.parseJsonWithGson(jsonData, Person.class);
System.out.println(person.getName() + "," + person.getAge());
}
}
/*
* 封裝的GSON解析工具類,提供泛型參數(shù)
*/
class GsonUtil {
//將Json數(shù)據(jù)解析成相應(yīng)的映射對(duì)象
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
}
}
class Person {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
以上代碼輸出結(jié)果:
John,20
(二)單條有嵌套的Json數(shù)據(jù)解析
比如有如下Json數(shù)據(jù):{"name":"John", "age":20,"grade":{"course":"English","score":100,"level":"A"}}
對(duì)這樣的數(shù)據(jù)就要用內(nèi)部類的來解決了。解析步驟如下:
- 1、定義Student類:
class Student {
private String name;
private String age;
private Grade grade;
public class Grade { // 內(nèi)部類要定義成public的
private String course;
private String score;
private String level;
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
// 重寫toString方法
@Override
public String toString() {
return "Grade:[course = " + course + ", score = " + score
+ ", level = " + level + "]";
}
}
// 重寫toString方法
@Override
public String toString() {
return "Student:[name = " + name + ", age = " + age + ", grade = "
+ grade + "]";
}
}
- 2、使用(一)中封裝的GsonUtil工具類進(jìn)行解析:
public class GsonTest1 {
public static void main(String[] args) {
String jsonData = "{'name':'John', 'age':20,'grade':{'course':'English','score':100,'level':'A'}}";
Student student = GsonUtil.parseJsonWithGson(jsonData, Student.class);
System.out.println(student);
}
}
/*
* 封裝的GSON解析工具類,提供泛型參數(shù)
*/
class GsonUtil {
// 將Json數(shù)據(jù)解析成相應(yīng)的映射對(duì)象
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
}
}
以上代碼輸出結(jié)果:
Student:[name = John, age = 20, grade = Grade:[course = English, score = 100, level = A]]
(三)解析Json數(shù)組(多條Json數(shù)據(jù))
比如有如下Json數(shù)據(jù):
[{'name':'John', 'grade':[{'course':'English','score':100},{'course':'Math','score':78}]}, {'name':'Tom', 'grade':[{'course':'English','score':86},{'course':'Math','score':90}]}]
注:Json數(shù)組最外層一定要加[]
如何處理這樣的數(shù)據(jù)呢?就要用到List。步驟如下:
示例程序如下:
import java.lang.reflect.Type;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* 用GSON解析Json數(shù)組
*/
public class GsonTest {
public static void main(String[] args) {
// Json數(shù)組最外層要加"[]"
String jsonData = "[{'name':'John', 'grade':[{'course':'English','score':100},{'course':'Math','score':78}]},{'name':'Tom', 'grade':[{'course':'English','score':86},{'course':'Math','score':90}]}]";
List<Student> students = GsonUtil.parseJsonArrayWithGson(jsonData,
Student.class);
System.out.println(students);
}
}
/*
* 封裝的GSON解析工具類,提供泛型參數(shù)
*/
class GsonUtil {
// 將Json數(shù)據(jù)解析成相應(yīng)的映射對(duì)象
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
}
// 將Json數(shù)組解析成相應(yīng)的映射對(duì)象列表
public static <T> List<T> parseJsonArrayWithGson(String jsonData,
Class<T> type) {
Gson gson = new Gson();
List<T> result = gson.fromJson(jsonData, new TypeToken<List<T>>() {
}.getType());
return result;
}
}
class Student {
private String name;
private List<Grade> grade; // 因?yàn)間rade是個(gè)數(shù)組,所以要定義成List
public class Grade {
private String course;
private String score;
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Grade> getGrade() {
return grade;
}
public void setGrade(List<Grade> grade) {
this.grade = grade;
}
}
以上代碼輸出結(jié)果:
[{name=John, grade=[{course=English, score=100.0}, {course=Math, score=78.0}]}, {name=Tom, grade=[{course=English, score=86.0}, {course=Math, score=90.0}]}]