zoukankan      html  css  js  c++  java
  • GSON使用笔记

    GSON简介

    GSON是Google开发的Java API,用于转换Java对象和Json对象,我在这里将记录一下GSON的简单使用

    下载GSON

    我们可以在其github仓库中下载,也可以使用Maven下载

    <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.1</version>
    </dependency>
    
    

    将JavaBean转换为JSON数据

    我们最常用的就是使用JavaBean来封装数据,所以使用JavaBean生成JSON的方法较为重要.在这里先创建一个JavaBean:

      public class User {
    
        private Integer id;
    
        private String userName;
    
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    }
    

    基础用法

    接下来我们就开始写测试代码(分三步):
    1.封装JavaBean数据
    2.new一个GSON对象
    3.使用toJson方法生成JSON数据

    	@Test
    	public void fun1(){
    
    		User user=new User();
    		user.setId(1);
    		user.setUserName("lz");
    		user.setPassword("123");
    
    		Gson gson=new Gson();
    		String json = gson.toJson(user);
    		System.out.println(json);
    	}
    

    显示的JSON数据为:

    {"id":1,"userName":"lz","password":"123"}
    

    格式化与自定义数据样式

    如果我们想将id变成大写的ID,可以在JavaBean中的id属性上添加SerializedName注解:

    这时生成的JSON数据就是:

    {"ID":1,"userName":"lz","password":"123"}
    

    GSON对象也可以使用GsonBuilder类创建出来:

            GsonBuilder builder=new GsonBuilder();
    		Gson gson=builder.create();
    

    使用GsonBuilder类可以进行更多的对生成的JSON数据的操作,比如说:格式化JSON:

    		GsonBuilder builder=new GsonBuilder();
    		builder.setPrettyPrinting();
    		Gson gson=builder.create();
    

    使用Builder类的setPrettyPrinting()方法就可以做到

    {
      "ID": 1,
      "userName": "lz",
      "password": "123"
    }
    

    同样我们使用setFieldNamingStrategy()方法也可以起到相同作用

    @Test
    	public void fun1(){
    
    		User user=new User();
    		user.setId(1);
    		user.setUserName("lz");
    		user.setPassword("123");
    
    		GsonBuilder builder=new GsonBuilder();
    		builder.setPrettyPrinting();
    		builder.setFieldNamingStrategy(new FieldNamingStrategy() {
    
    			@Override
    			public String translateName(Field arg0) {
    				if(arg0.getName().equals("id")){
    					return "ID";
    				}
    				return arg0.getName();
    			}
    		});
    		Gson gson=builder.create();
    		String json = gson.toJson(user);
    		System.out.println(json);
    	}
    

    处理部分属性

    如果我们希望单独处理某些属性来生成JSON数据,可以有以下方法:
    1.设置忽略值为null

    Gson gson=builder.serializeNulls().create();
    

    这样在我们没有设置属性的值的时候,会显示null

    {"ID":1,"userName":"lz","password":null}
    

    2.在JavaBean中的属性使用Java关键字transient

    这样在生成的JSON数据中就会忽略该值

    {"ID":1,"userName":"lz"}
    

    password值被忽略
    3.当然也可以在Java代码中忽略某属性

    		GsonBuilder builder=new GsonBuilder();
    		Gson gson=builder.setExclusionStrategies(new ExclusionStrategy() {
    
    			@Override
    			public boolean shouldSkipField(FieldAttributes arg0) {
    				if(arg0.getName().equals("password")){
    					return true;
    				}
    				return false;
    			}
    
    			@Override
    			public boolean shouldSkipClass(Class<?> arg0) {
    				// TODO Auto-generated method stub
    				return false;
    			}
    		}).create();
    		String json = gson.toJson(user);
    

    使用setExclusionStrategies()方法并重写shouldSkipField()方法就可以将password属性给过滤掉
    4.格式化日期类型
    我们先在JavaBean中添加一个Date类型的birthday属性,然后使用Builder类的setDateFormat方法可以格式化日期

    Gson gson=builder.setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    

    JSON数据为:

    {"ID":1,"userName":"lz","birthday":"2017-07-29 13:50:22"}
    

    解析JSON数据

    前面写的都是将数据生成JSON格式,下面我们反其道而行,解析一段JSON数据,并将数据封装到JavaBean中。
    JSON数据:

    {
      "userName":"lz",
      "password":"321",
      "birthday":"2017-07-29 13:50:22"
    }
    

    使用的GSON对象的fromJson方法

    	@Test
    	public void fun2() throws Exception{
    		String path = MyTest.class.getResource("/test.json").getFile();
    		File file=new File(path);
    		String json = FileUtils.readFileToString(file);
    		Gson gson=new Gson();
    		User user = gson.fromJson(json, User.class);
    		System.out.println(user);
    	}
    

    我们打印user对象:

    User [id=null, userName=lz, password=321, birthday=Sat Jul 29 13:50:22 CST 2017]
    

    我们在解析时间的时候同样也可以格式化时间格式,使用的还是上面我们用过的setDateFormat方法(注意:在这里GSON对象的创建就需要通过GsonBuilder类来create出来)

    		GsonBuilder builder=new GsonBuilder();
    		Gson gson=builder.setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    		User user = gson.fromJson(json, User.class);
    		System.out.println(user.getBirthday().toLocaleString());
    

    结果为:

    2017-7-29 13:50:22
    

    可以知道时间已经被格式化了
    最后还值得说的一点是如果我们在JavaBean中使用集合,GSON会将JOSN数据中对应的数组类型自动解析为具体的集合类型,不用我们再进行处理

    {
      "userName":"lz",
      "password":"321",
      "birthday":"2017-07-29 13:50:22",
      "jineng":[
         "Struts2","springMVC"
      ]
    }
    

    	@Test
    	public void fun3() throws Exception{
    		String path = MyTest.class.getResource("/test.json").getFile();
    		File file=new File(path);
    		String json = FileUtils.readFileToString(file);
    		Gson gson=new Gson();
    		User user = gson.fromJson(json, User.class);
    		System.out.println(user);
    		System.out.println(user.getJineng());
    		System.out.println(user.getJineng().getClass());
    	}
    

    打印结果为:

    User [id=null, userName=lz, password=321, birthday=Sat Jul 29 13:50:22 CST 2017, jineng=[Struts2, springMVC]]
    [Struts2, springMVC]
    class java.util.ArrayList
    

    可以看到在JavaBean中我们只是使用List接口,而GSON可以帮助我们选择具体的类型来封装集合

  • 相关阅读:
    一套权威的 MQTT Client 库
    tcp编程 示例
    我的座右铭
    win7改装 CentOS7,装完后开机,没有引导
    程序员16个建议
    Linux
    Linux
    socket
    关于RESTFUL的理解
    Django Rest Framework
  • 原文地址:https://www.cnblogs.com/lz2017/p/7255845.html
Copyright © 2011-2022 走看看