GSON的使用

Gson(A Java serialization/deserialization library to convert Java Objects into JSON and back)
是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。

 1. Gson Goals

    • 提供简单的toJson()fromJson()方法的Java对象转换为JSON,反之亦然
    • 允许将先前存在的不可修改对象转换为JSON或从JSON转换
    • 广泛的Java泛型支持
    • 允许对象的自定义表示
    • 支持任意复杂的对象(具有深层继承层次结构和泛型类型的广泛使用)

 2. GSON生成JSON数据

2.1 首先在pom.xml加入依赖(Maven创建)

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.0</version>
</dependency>

2.2 为JavaBean实例赋值之后,生成Gson对象,并利用toJson(object)方法将数据转换为json格式

import com.google.gson.Gson;
public class GsonCreateSimple {
    public static void main(String[] args) {
        //1.创建Person对象,利用set()方法赋值
        Person xiaofeng=new Person();
        xiaofeng.setName("小峰");
        xiaofeng.setAge(22.5);
        xiaofeng.setGirlfriend(true);
        xiaofeng.setMajor(new String[]{"唱歌","coding"});
        
        //2.创建一个Gson对象,并利用toJson(object)方法将数据转换为json格式
        Gson gson =new Gson();
        System.out.println(gson.toJson(xiaofeng));
    }    
}

输出Json格式:

2.3 修正的方法 tips

  2.3.1 @SerializedName注解

  有时需要在输出的Json数据中显示自己想要的效果而不能直接修改JavaBean属性名称时(比如上例想要将 "name" 转换为 “名字” 输出在控制台),可以在JavaBean类里想要转换的属性前加上该注解@SerializedName(“想要显示的内容”)。

上例:修改Person类,在属性“name”前加上注解

控制台输出:

  2.3.2 GsonBuilder(用于对json数据美化,或者个性化输出)

public class GsonCreateSimple {

    public static void main(String[] args) {
        //1.创建Person对象,利用set()方法赋值
        Person xiaofeng=new Person();
        xiaofeng.setName("小峰");
        xiaofeng.setAge(22.5);
        xiaofeng.setGirlfriend(true);
        xiaofeng.setMajor(new String[]{"唱歌","coding"});  
      
//2.创建一个Gson对象,并利用toJson(object)方法将数据转换为json格式 //Gson gson =new Gson(); GsonBuilder gsonBuilder=new GsonBuilder(); gsonBuilder.setPrettyPrinting(); //将json数据按层次格式输出,更直观,常用于调试 //为json数据输出添加逻辑 gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() { public String translateName(Field field) { if(field.getName().equals("age")){ return "今年多大了啊:"; } return field.getName(); } });
Gson gson
=gsonBuilder.create(); System.out.println(gson.toJson(xiaofeng)); } }

该demo将json数据结构化输出,并将属性 “age”个性化输出:

            

注意:输出json数据时,会将属性名输出,如果不想输出该属性,可在声明属性时使用transient修饰,这样即使赋值也不会输出了

private transient String ignore;
3. GSON 解析

JSONObject可以将*.json文件解析成一个它的对象;Gson可以正向的生成,也可以解析成自己定义的一个JavaBean的对象。
xiaofeng.json
{"birthday":"1999-11-22","girlfriend":"true","major":["sing","coding"],"school":"Qinghua University","car":null,"name":"小峰","comment":"JSON里不能直接使用注释,需要添加时可通过此方式。。","age":22}
解析demo:ReadGson.java
public class ReadGson {
    public static void main(String[] args) throws IOException {
// 获取本文件路径下的json文件 File file = new File(ReadJSON.class.getResource("/xiaofeng.json").getFile()); // 读取json文件内容 String content = FileUtils.readFileToString(file);
//生成Gson对象,利用其fromJson(String json,Class<T> class)方法来解析Json数据,生成JavaBean对象 Gson gson =new Gson(); Person xiaofeng=gson.fromJson(content, Person.class); //输出对象,此处JavaBean类有toString()方法,故可直接打印 System.out.println(xiaofeng); } }

注意:此处需要Person类的属性和解析的 xiaofeng.json内的 key相对应。

 

 4. GSON解析特殊格式(相较于JSON的优势所在)

 4.1 带日期转换

在JSON里Date格式需要设置为String类型,而在Gson里是可以忽略这个问题的

下面demo中,在 PersonByGson类里Birthday的属性为Date类型的,解析时再设置显示的格式

            

     // 获取本文件路径下的json文件
        File file = new File(ReadJSON.class.getResource("/xiaofeng.json").getFile());
        // 读取json文件内容
        String content = FileUtils.readFileToString(file);
        //生成Gson对象,利用其fromJson(String json,Class<T> class)方法来解析Json数据
        //Gson gson =new Gson();
        
        Gson gson =new GsonBuilder().setDateFormat("yyyy-MM-dd").create();//这里通过创建GsonBuild对象来设置格式
        PersonByGson xiaofeng=gson.fromJson(content, PersonByGson.class);
 
        //输出日期    toLocaleString()
        System.out.println(xiaofeng.getBirthday().toLocaleString());

输出日期格式:

                

 4.2 集合类解析

将JavaBean类中数组格式属性转换为List 集合属性(注意相应修改setXx()和getXx()和toString()方法)

              

直接输出(解析程序同上,自动匹配相应的ArrayList,属性是Set格式的话是LinkedHashSet):

         

5. 对JSON库作一总结:

功能:映射Java Object与json格式数据

  1.通过Annotation注解来声明
  2.支持自定义属性名称
  3.支持包含或排除属性
  4.支持自定义接口自己完成解析/生成过程

 

 

 

https://github.com/google/gson

posted @ 2017-05-22 16:10  雪山上的蒲公英  阅读(824)  评论(0编辑  收藏  举报
/* 返回顶部代码 */