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可以帮助我们选择具体的类型来封装集合
GSON使用笔记的更多相关文章
- Gson 简易笔记
#Gson 简易笔记 之前用 fastjson.它连个规矩的文档都没有,而且在github的wiki上写着: gson的g可能是"龟"拼音的缩写,龟速的json库." 各 ...
- GSON使用笔记(3) -- 如何反序列化出List
GSON使用笔记(3) -- 如何反序列化出List 时间 2014-06-26 17:57:06 CSDN博客原文 http://blog.csdn.net/zxhoo/article/deta ...
- Java Gson 简要笔记
Gson是Google开发的Java比较好用的 Json工具. 使用挺简单,假设有个类: class Runner { int attr; String name; public Runner(int ...
- GSON使用笔记(1) -- 序列化时排除字段的几种方式
http://blog.csdn.net/zxhoo/article/details/21471005 GSON是Google发布的JSON序列化/反序列化工具,非常容易使用.本文简要讨论在使用GSO ...
- Android Gson使用笔记
最近在做一个java web service项目,需要用到jason,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson,因为之前对于protoco ...
- Json工具类库之Gson实战笔记
日常接口的数据传输通常使用xml或者json来传递数据,xml较庞大但是描述数据能力十分出众,json数据结构较小而且支持ajax传输,xml在数据传输和解析资源占用都比较逊色于json.因此日常的接 ...
- GSON学习笔记之初识GSON
引用"JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,採用全然独立于语言的文本格式.为Web应用开发提供了一种理想的数据交换格式. " ...
- 使用Gson解析json
前边的博客说过将json解析成java的方法,使用的是 这几个jar包,但是在解析时层遇到一个问题,就是在将时间字符串转换为java的Timestamp对象时会抛出异常,这个问题一直放在哪里没有去解决 ...
- Gson--Gson解析=等号出现乱码?
GSON使用笔记(1) -- 序列化时排除字段的几种方式 --3,关于Gson解析时候特殊符号,被转义的问题,如'单引号? //Creating the JSON object, and gettin ...
随机推荐
- 剑指offer--44.两个链表的第一个公共结点
@selfboot 牛逼的代码,长度相同,一遍出结果, 长度不同,短的点跑完,变成长的,当长的跑完变成短的链表的时候,较长的链表已经走过了多的结点. ------------------------- ...
- (转)MapReduce Design Patterns(chapter 3 (part 2))(六)
Top Ten Pattern Description Top ten模式跟前面的有很大的不同,跟输入数据大小无关,最终得到的记录数量是确定的.而在通用filtering中,输出的规模取决于输入数据. ...
- Android gradle 安装成功,但是报虚拟机过大的错误处理方法
一.这个是项目中遇到的问题,记下来,以后再出现方便查看. 1.首先看图吧. 虚拟机内容过大 解决办法: 在.gradle目录下更改配置文件gradle.properjties 里面的 将标记的改成51 ...
- tomcat是否有必要配置环境变量
之前发表了一篇关于如何安装和配置Tomcat的文章,而最近在开发项目的时候总是报错.后来被公司的大神问了一句:是谁告诉你Tomcat是需要配置环境变量的? 作为新手的我瞬间整个人都不好了!于是偷偷百度 ...
- NSPort
NSPort是一个描述通信通道的抽象类.通信发生在两个NSPort对象之中,这两个NSPort对象通常属于不同的进程或任务.分发对象系统使用NSPort对象来返回或发送NSProtMessage对象. ...
- css3公共样式
温馨提示:一下css封装,建议按需使用,否则会造成很大的代码冗余,且很多样式会造成不符合预期的效果,建议合理使用 <a href="https://meyerweb.com/eric/ ...
- Infinite size of Hypothesis set and growth function
We want: 根据Hoeffding: 但是M是无穷大的,是否可以找到一个有穷大的m_H去替代无穷大的M? 思考:M从何而来。 Hset里有M个h,对于每个Data,只要存在一个h会造成Bad,即 ...
- 让svn具有分布式的功能。
最近开发遇到了个难事.公司的svn库不能随便提交,必须要经过验证.但是平时修改太多,如果不提交到svn说不定前面被删掉的代码后面又需要了.svn自带的relocate和switch都不能达到要求.找遍 ...
- BZOJ2653 middle 【主席树】【二分】*
BZOJ2653 middle Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个长度为n的序列s.回答Q个这样 ...
- 《DSP using MATLAB》示例Example 6.27
代码: % r = 0.9; theta = (pi/180)*[-55:5:-35, 35:5:55]'; p = r*exp(j*theta); a = poly(p); b = 1; w = [ ...