Gson序列化对象如何忽略字段
Gson序列化对象如何忽略字段
Gson版本 2.8.2
附gson-2.8.2下载链接
梗概
- 忽略字段。用注解
@Expose(serialize = false, deserialize = false)在类的成员上以告诉Gson 跳过本字段的(反)序列化。 (反)序列化时,需要Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()而不是Gson gson = new Gson() - 自定义序列化和反序列化
忽略字段
比如有下User类,我不想把nickName也输出出来,网上查了查,说只要把注解改成@Expose(serialize = false, deserialize = false)
package go.Gson;
import com.google.gson.Gson;
import com.google.gson.annotations.Expose;
public class User {
User(String name_, String nickName_) {
name = name_;
nickName = nickName_;
}
public static void main(String[] args) {
User u = new User("Jackey", "Jack");
Gson gson = new Gson();
System.out.println(gson.toJson(u));//{"name":"Jackey","nickName":"Jack"}
}
@Expose
String name;
@Expose(serialize = false, deserialize = false)
String nickName;
}
事实是注解改了以后, 也还是会输出nickName的。
查看了下Gson-2.8.2的源码,在Expose.java中有注释,说如何使用
public class User {
@Expose private String firstName;
@Expose(serialize = false) private String lastName;
@Expose (serialize = false, deserialize = false) private String emailAddress;
private String password;
}
If you created Gson with {@code new Gson()}, the {@code toJson()} and {@code fromJson()}
methods will use the {@code password} field along-with {@code firstName}, {@code lastName},
and {@code emailAddress} for serialization and deserialization. However, if you created Gson
with {@code Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()}
then the {@code toJson()} and {@code fromJson()} methods of Gson will exclude the
{@code password} field. This is because the {@code password} field is not marked with the
{@code @Expose} annotation. Gson will also exclude {@code lastName} and {@code emailAddress}
from serialization since {@code serialize} is set to {@code false}. Similarly, Gson will
exclude {@code emailAddress} from deserialization since {@code deserialize} is set to false.
即使用Gson gson = new Gson()注解不会生效,需要用Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()去配置Gson
代码改成如下即可
package go.Gson;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
public class User {
User(String name_, String nickName_) {
name = name_;
nickName = nickName_;
}
public static void main(String[] args) {
User u = new User("Jackey", "Jack");
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
System.out.println(gson.toJson(u));// {"name":"Jackey"}
}
@Expose
String name;
@Expose(serialize = false, deserialize = false)
String nickName;
}
自定义序列化过程
设想一个UserWrapper类
package go.Gson;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
public class UserWrapper {
UserWrapper(){
user = new User("Jackey", "Jack");
}
public static void main(String[] args) {
UserWrapper u = new UserWrapper();
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
System.out.println(gson.toJson(u));
}
@Expose
private User user;
}
class User {
User(String name_, String nickName_) {
name = name_;
nickName = nickName_;
}
@Expose
String name;
@Expose(serialize = false, deserialize = false)
String nickName;
}
这个会输出{"user":{"name":"Jackey"}},这很讨厌,我们想让User对象只输出name的值,要这么做:
package go.Gson;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.annotations.Expose;
public class UserWrapper {
UserWrapper(){
user = new User("Jackey", "Jack");
}
public static void main(String[] args) {
UserWrapper u = new UserWrapper();
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation()
.registerTypeAdapter(User.class, new UserAdapter()).create();
System.out.println(gson.toJson(u));
}
@Expose
private User user;
}
class User {
User(String name_, String nickName_) {
name = name_;
nickName = nickName_;
}
@Expose
String name;
@Expose(serialize = false, deserialize = false)
String nickName;
}
class UserAdapter implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
return context.serialize(src.name);
}
}
类似的interface 还有JsonDeserializer,TypeAdapter
Gson序列化对象如何忽略字段的更多相关文章
- Gson序列化对象时排除字段
import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; /** *Gson序列化对象排除属性 ...
- xml 和 json 序列化忽略字段
xml 和 json 序列化忽略字段: @JsonIgnore @XmlTransient
- 完全理解Gson(2):Gson序列化
通过调用 Gson API 可以把 Java 对象转换为 JSON 格式的字符串(项目主页).在这篇文章中,我们将会讲到如何通过 Gson 默认实现和自定义实现方式,将 Java 对象转换为 JSO ...
- c# XML序列化与反序列化 属性字段标识
序列化对象 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAt ...
- Java 序列化 对象序列化和反序列化
Java 序列化 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制 ...
- FastJson的忽略字段和格式日期用法
1.指定序列化顺序 缺省fastjson序列化一个java bean,是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序.这个特性需要1.1.42以上版本. pub ...
- DELPHI XE2 采用 JSON 的方式来序列化对象
DELPHI XE2 采用 JSON 的方式来序列化对象 以下代码测试通过.问题是里面的中文,在反序列化后是乱码. 1. 序列化对象为字符串,Subject 里面的中文看起来正常,仍然是中文: 2. ...
- Android使用HttpURLConnection通过POST方式发送java序列化对象
使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...
- 序列化对象为xml字符串
/// <summary> /// 序列化对象为xml字符串 /// </summary> /// <param name="obj" ...
随机推荐
- C#开发Open-Webkit-Sharp浏览器并支持前端alert显示
看了网上的很多教程,但是总是总是只言片语的,可能不同的人遇到的问题不一样,他们就只列举了自己的问题,那么这里我来做一下总结吧,跟大家分享一下我的完整的开发过程 首先你需要准备Visual Studio ...
- kafka概念使用简介注意点
使用场景 大数据量.低并发.高可用.订阅消费场景 概念理解 分区个数与消费者个数 分区个数 = 消费者个数 :最合适状态 分区个数 > 消费者个数 :某些消费者要承担更多的分区数据消费 分区个数 ...
- Ubuntu上安装VMware tools
Ubuntu上安装VMware tools author:headsen chen 2017-10-12 - 10:13:50 个人原创,转载请注明作者,出处,否则.依法追究法律责任 ch ...
- PDF加密无法做笔记
尝试打印PDF,若无法打印,可以利用PDFescape(http://www.pdfescape.com/) PDFescape是一个可以在线修改.做笔记的网站,但是在线使用有上传PDF大小限制(小于 ...
- 使用nodegrass简单封装http请求例子
1.项目中经常性的使用http发送请求处理数据.而大部分请求方式为get和post,于是对http请求进行封装,提供代码的利用率. 2.nodegress是nodejs的一个请求工具. 具体步骤及代码 ...
- django “如何”系列4:如何编写自定义模板标签和过滤器
django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码 ...
- jenkins忘记密码怎么办?
在nginx配置文件中加上域名访问,重定向到本机的8080端口. server { listen 80; server_name tomcat.qinyj.top; root /application ...
- java各种概念 Core Java总结
Base: OOA是什么?OOD是什么?OOP是什么?{ oo(object-oriented):基于对象概念,以对象为中心,以类和继承为构造机制,来认识,理解,刻画客观世界和设计,构建相应的软件系统 ...
- Java几种建立实例的方法
1.new something obj=new something(); 2.clone 根据现有的对象实例来建立里一个新对象实例. 只限于实现了java.lang.Cloneable接口的类.否 ...
- 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...