zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python模块之StringIO/cStringIO(内存文件)
    python3之json模块使用
    使用chardet判断编码方式
    HBase笔记之远程Shell界面命令行无法删除字符的解决方案
    Linux命令之uptime
    Redis笔记之常用命令
    Spring Boot笔记之自定义启动banner
    Windows Live Writer博客草稿迁移的一种解决方案
    ActiveMQ笔记之安装(Linux)
    Impala笔记之通用命令
  • 原文地址:https://www.cnblogs.com/zjfjava/p/6887829.html
Copyright © 2011-2022 走看看