Java-json系列(一):用GSON解析Json格式數(shù)據(jù)

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}]}]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容