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可以帮助我们选择具体的类型来封装集合

GSON使用笔记的更多相关文章

  1. Gson 简易笔记

    #Gson 简易笔记 之前用 fastjson.它连个规矩的文档都没有,而且在github的wiki上写着: gson的g可能是"龟"拼音的缩写,龟速的json库." 各 ...

  2. GSON使用笔记(3) -- 如何反序列化出List

    GSON使用笔记(3) -- 如何反序列化出List 时间 2014-06-26 17:57:06  CSDN博客原文  http://blog.csdn.net/zxhoo/article/deta ...

  3. Java Gson 简要笔记

    Gson是Google开发的Java比较好用的 Json工具. 使用挺简单,假设有个类: class Runner { int attr; String name; public Runner(int ...

  4. GSON使用笔记(1) -- 序列化时排除字段的几种方式

    http://blog.csdn.net/zxhoo/article/details/21471005 GSON是Google发布的JSON序列化/反序列化工具,非常容易使用.本文简要讨论在使用GSO ...

  5. Android Gson使用笔记

    最近在做一个java web service项目,需要用到jason,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson,因为之前对于protoco ...

  6. Json工具类库之Gson实战笔记

    日常接口的数据传输通常使用xml或者json来传递数据,xml较庞大但是描述数据能力十分出众,json数据结构较小而且支持ajax传输,xml在数据传输和解析资源占用都比较逊色于json.因此日常的接 ...

  7. GSON学习笔记之初识GSON

    引用"JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,採用全然独立于语言的文本格式.为Web应用开发提供了一种理想的数据交换格式. " ...

  8. 使用Gson解析json

    前边的博客说过将json解析成java的方法,使用的是 这几个jar包,但是在解析时层遇到一个问题,就是在将时间字符串转换为java的Timestamp对象时会抛出异常,这个问题一直放在哪里没有去解决 ...

  9. Gson--Gson解析=等号出现乱码?

    GSON使用笔记(1) -- 序列化时排除字段的几种方式 --3,关于Gson解析时候特殊符号,被转义的问题,如'单引号? //Creating the JSON object, and gettin ...

随机推荐

  1. 用servlet来提取数据,并作统计,然后用jfreechart画图

    指定时间范围的数据提取,并做统计: 用servlet来提取数据,并作统计,然后用jfreechart画图. 使用的话,需要在web.xml里面配置相应的servlet,并且在index.jsp页面做引 ...

  2. 【Shell脚本】逐行处理文本文件

    经常会对文体文件进行逐行处理,在Shell里面如何获取每行数据,然后处理该行数据,最后读取下一行数据,循环处理.有多种解决方法如下: 1.通过read命令完成. read命令接收标准输入,或其他文件描 ...

  3. java.lang.IllegalArgumentException: Invalid character found in method name

    1.错误描述 信息: Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors ...

  4. Java之JVM逃逸分析

    引言: 逃逸分析(Escape Analysis)是众多JVM技术中的一个使用不多的技术点,本文将通过一个实例来分析其使用场景. 概念 逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配 ...

  5. EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug

    本文转自EasyDarwin团队成员John的博客:http://blog.csdn.net/jyt0551/article/details/75717097 最近发现某些手机在运行EasyPlaye ...

  6. MPAndroidChart Wiki(译文)~Part 2

    7. 填充数据 这一章节将讲解给各式各样的图表设置数据的方法. 7.1 LineChart(线形图) 想给图表添加数据,使用如下方法: public void setData(ChartData da ...

  7. No form of payment has been added yet.

    You may select a form of payment after your account balance reaches $10.00. Learn more 显然是说达到10美元以后才 ...

  8. 数据链路层、ARP/RARP、ICMP、ping和traceroute

    互联网基础:   数据链路层:RFC文档:894/1042/1340 为IP模块发送和接受IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答   ...

  9. mysql在innodb索引下b+树的高度问题。

    B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...

  10. vue自定义指令v-scroll(directive)

    vue开发中,很多地方如果说都用到了某一方法,我们就可以进行指令化封装,通过自定义指令来实现这里通过两个例子说明vue-Directive的使用 1.v-focus 主要用来实现页面加载进来的时候文本 ...