java解析Json詳解

2020-08-12 18:49:14

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