JSON
內容:概念、使用、解析、封裝物件
一、概念:JavaScript Object Notation (JavaScript 物件表示法),輕量級的文字數據交換格式
JSON 是儲存和交換文字資訊的語法。類似 XML。
JSON 比 XML 更小、更快,更易解析。
二、json數據格式:
1、json物件:{ m:z,m:z,m:z,m,z } 括號中由多個名值對組成,每個名值隊之間用逗號隔開,名值之間用冒號隔(名,值型別沒有明確規定)
2、json陣列:{ 「team」:[「a」,「b」,「c」,「d」] }
{ "stus":[ {"id":1234,"name":"張三","age":21,"sex":"男"}, {"id":2345,"name":"李四","age":22,"sex":"男"}, {"id":3456,"name":"王五","age":23,"sex":"女"}, {"id":4567,"name":"小黑","age":18,"sex":"男"}, {"id":5678,"name":"小白","age":32,"sex":"女"}, {"id":6789,"name":"小灰","age":22,"sex":"男"}]}
3、JSON 與 XML 相同之處:JSON 和 XML 數據都是 「自我描述」 ,易於理解,數據都是有層次的結構,JSON 和 XML 數據可以被大多數程式語言使用。
4、JSON 與 XML 的不同之處:JSON 不需要結束標籤、JSON 更加簡短、JSON 讀寫速度更快、JSON 可以使用陣列。
最大的不同是:XML 需要使用 XML 解析器來解析,JSON 可以使用標準的 JavaScript 函數來解析。
三、json解析:在javaScript中可以直接解析,但是在java中無法直接解析,需要依賴第三方解析器(GSON、fastjson…)
使用GSION解析json:
3.1 匯入GSON jar包:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
3.2 、單條無巢狀Json數據的解析
比如有如下Json數據:{「name」:「John」, 「age」:20} //也可以用單引號,寫成:{‘name’:‘John’, ‘age’:20}
解析該數據步驟如下:
3.2.1、定義Person類:
public class Student {
private String name;
private int age;
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;
}
}
3.2.2、建立GSON物件並解析:
String jsonData = "{\"name\":\"John\", \"age\":20}";
//注:這裏也可以不使用跳脫字元,而用單引號:String jsonData = "{'name':'John', 'age':20}";
Gson gson=new Gson();
Person person = gson.fromJson(jsonData,Person.class);
3.2.3、然後使用Person物件的getter方法就可以獲取到數據了。
3.2.4、擴充套件:考慮到Json數據的不同,那麼解析Json的時候所用的類也可能不同,比如這裏用的是Person,如果解析其他數據可能用的又是Dog、Cat…所以考慮將用GSON解析的步驟封裝,並提供泛型參數,範例程式如下:
package com.aurora;
import com.google.gson.Gson;
/**
* 用GSON解析單條Json數據
*/
public class Text {
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解析工具類,提供泛型參數
*/
class GsonUtil {
//將Json數據解析成相應的對映物件
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
}
}
3.3、單條有巢狀的Json數據解析
如下Json數據:{「name」:「John」, 「age」:20,「grade」:{「course」:「English」,「score」:100,「level」:「A」}}對這樣的數據就要用內部類的來解決了。解析步驟如下:
3.3.1、定義Student類:
package com.aurora;
/**
* @Author aurora
* @Description 學生類
* @Date 2020-08-08 16:36
* @Param
* @Return
**/
public class Student {
private String name;
private String age;
private Grade grade;
public class Grade { // 內部類要定義成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 + "]";
}
}
}
3.3.2、使用工具類進行解析
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);
}
3.4、解析Json陣列(多條Json數據)比如有如下Json數據:
[{‘name’:‘John’, ‘grade’:[{‘course’:‘English’,‘score’:100},{‘course’:‘Math’,‘score’:78}]}, {‘name’:‘Tom’, ‘grade’:[{‘course’:‘English’,‘score’:86},{‘course’:‘Math’,‘score’:90}]}] //注:Json陣列最外層一定要加"[]"
如何處理這樣的數據呢?就要用到List。步驟如下:
package com.aurora;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* 用GSON解析Json陣列
*/
public class GsonTest {
public static void main(String[] args) {
// Json陣列最外層要加"[]"
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解析工具類,提供泛型參數
*/
class GsonUtil {
// 將Json數據解析成相應的對映物件
public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
Gson gson = new Gson();
T result = gson.fromJson(jsonData, type);
return result;
}
// 將Json陣列解析成相應的對映物件列表
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; // 因爲grade是個陣列,所以要定義成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;
}
}