Gson本身并不提供循环引用的直接解决方案。我们可以通过以下方式来解决循环引用的问题:
使用ava关键字transient
private transient int value = 3;
在序列化的时候value不会生成到json字符串中。
使用Gson提供的注解@Expose
@Exclude
private String value;
当然,要使用这个属性必须通过以下语句来构造Gson对象
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
我们也可以自定义注解来标注需要过滤的属性,参见官方的User Guide,需要使用到过滤策略,在下文也会提到。
使用排除策略
以上只能是通过“硬编码”的方式来排除属性,有些时候我们需要根据某种来选择性得过滤一些属性。这是我们可以使用使用Gson提供的排除策略ExclusionStrategy接口。如:
public class MyExclusionStrategy implements ExclusionStrategy {
private MyExclusionStrategy(Class<?> typeToSkip) {
}
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
public boolean shouldSkipField(FieldAttributes f) {
return false;
}
}
我们可以通过类级别和属性级别来过滤属性。以上提到的关于自定义注解的实现是在属性级别上实现的。具体方法是
public boolean shouldSkipField(FieldAttributes f) {
// Foo是一个自定义注解
return f.getAnnotation(Foo.class) != null;
}
一般情况下,我们可以通过根据属性名的判断来实现实现逻辑过滤。当然,在序列化之前,需要用一下代码来构造Gson对象:
Gson gson = new GsonBuilder()
.setExclusionStrategies(new MyExclusionStrategy(SomeObject.class))
.create();
自定义序列化器
在有些情况下,我们可能会为某一个类来绑定一种序列化或反序列化器。
public class MyAdaper1 implements JsonSerializer<DataStore> {
@Override
public JsonElement serialize(DataStore src, Type typeOfSrc,
JsonSerializationContext context) {
ExclusionStrategy strategy = new DmsExclusionStrategy(
src.getExcludeFields(), src.getExcludeClasses());
Gson gson = new GsonBuilder().setExclusionStrategies(strategy)
.serializeNulls().create();
return gson.toJsonTree(src);
}
}
注册序列化器:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyType1.class, new MyTypeAdapter())
.registerTypeAdapter(MyType2.class, new MyTypeAdapter2());
最佳实践——综合使用自定义序列化器和排除策略
通常情况下,我们一下如下定义排除策略
public class DmsExclusionStrategy implements ExclusionStrategy {
public DmsExclusionStrategy() {
}
public DmsExclusionStrategy(String[] excludeFields,
Class<?>[] excludeClasses) {
this.excludeFields = excludeFields;
this.excludeClasses = excludeClasses;
}
private String[] excludeFields;
private Class<?>[] excludeClasses;
public boolean shouldSkipClass(Class<?> clazz) {
if (this.excludeClasses == null) {
return false;
}
for (Class<?> excludeClass : excludeClasses) {
if (excludeClass.getName().equals(clazz.getName())) {
return true;
}
}
return false;
}
public boolean shouldSkipField(FieldAttributes f) {
if (this.excludeFields == null) {
return false;
}
for (String field : this.excludeFields) {
if (field.equals(f.getName())) {
return true;
}
}
return false;
}
public final String[] getExcludeFields() {
return excludeFields;
}
public final Class<?>[] getExcludeClasses() {
return excludeClasses;
}
}
定义一个排除模型:
public class Excludable {
/**
* 不需要序列化的域.
*/
private transient String[] excludeFields;
/**
* 不需要序列化的类.
*/
private transient Class<?>[] excludeClasses;
public void setExcludeFields(String[] excludeFields) {
this.excludeFields = excludeFields;
}
public String[] getExcludeFields() {
return excludeFields;
}
public void setExcludeClasses(Class<?>[] excludeClasses) {
this.excludeClasses = excludeClasses;
}
public Class<?>[] getExcludeClasses() {
return excludeClasses;
}
}
当我们需要为某个类应用过滤策略时,我们让这个类继承Excludable,自定义其相应的序列化器,在序列化的过程中应用排除策略。
public class MyTypeSerializer implements JsonSerializer<MyType> {
@Override
public JsonElement serialize(MyType src, Type typeOfSrc,
JsonSerializationContext context) {
ExclusionStrategy strategy = new DmsExclusionStrategy(
src.getExcludeFields(), src.getExcludeClasses());
Gson gson = new GsonBuilder().setExclusionStrategies(strategy)
.serializeNulls().create();
return gson.toJsonTree(src);
}
}
分享到:
相关推荐
介绍:Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. 压缩包里有以下文件: ...
Provide simple toJson() and fromJson() methods to convert Java objects to JSON and vice-versa Allow pre-existing unmodifiable objects to be converted to and from JSON Extensive support of Java ...
om.google.code.gson/gson/2.6.2 Gson maven依赖 java 开发包
gson-2.3.1的jar包含源码和说明文档,是完整的版本了。
json我们在网络请求中经常用到,最近最火的微信小程序开发中更是必不可少。... 用户列表对象,使用JSONObject jsonStu = JSONObject.fromObject(list);...资源中提供了jar包与代码示例,一句代码解决您的问题。
gson jar包 gson jar包下载 gson jar包下载 gson jar包下载
赠送jar包:gson-2.8.0.jar; 赠送原API文档:gson-2.8.0-javadoc.jar; 赠送源代码:gson-2.8.0-sources.jar; 赠送Maven依赖信息文件:gson-2.8.0.pom; 包含翻译后的API文档:gson-2.8.0-javadoc-API文档-中文...
com.google.gson.Gson 2.8.1 2.8.2 jar包 gson,直接解压到maven仓库,或者提取里面的jar包都可以使用
GSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。 Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个JSON字符串...
包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class ...
Gson是Google的一个开源项目,可以将Java对象转换成JSON,也可能将JSON转换成Java对象。 Gson里最重要的对象有2个Gson 和 GsonBuilder Gson有2个最基本的方法 1) toJson() – 转换java 对象到JSON 2) from...
废弃fastjson!大型项目迁移Gson保姆级攻略(csdn)————程序
赠送jar包:gson-2.8.7.jar; 赠送原API文档:gson-2.8.7-javadoc.jar; 赠送源代码:gson-2.8.7-sources.jar; 赠送Maven依赖信息文件:gson-2.8.7.pom; 包含翻译后的API文档:gson-2.8.7-javadoc-API文档-中文...
截止至2018-11-27,github上com.google.gson.Gson 最新的2.8.5jar包。强大的json字符串解析功能及将字符串转换为json格式。我16年上传的免费下载的2.8.0版本不知道为什么变成下载需要50分了
截止至2016-12-23,github上com.google.gson.Gson 最新的2.8.0jar包。强大的json字符串解析功能及将字符串转换为json格式。才发现需要这么多分,大家也可以去网盘下载: ...
赠送jar包:gson-2.8.9.jar; 赠送原API文档:gson-2.8.9-javadoc.jar; 赠送源代码:gson-2.8.9-sources.jar; 赠送Maven依赖信息文件:gson-2.8.9.pom; 包含翻译后的API文档:gson-2.8.9-javadoc-API文档-中文...
GSON完整包,包含三个jar包。 gson-2.2.4.jar GSON生成解析json数据的基本jar包; gson-2.2.4-javadoc.jar GSON API介绍文档包; gson-2.2.4-sources.jar GSON源码包。 下载一个玩玩吧!
网络上有很多Json解析库,这里我使用Gson来解析Json,Gson有个特点,就是要将数据的键作为变量封装到一个个实体中,如果值为数组的,变量的类型还必须是集合,然后通过Gson.fromJson来传入数据和实体类,再通过实体...
java解析json所需的三个jar包。包含org.json、Gson、fastjson三个jar包
Gson-2.8.1的官方jar包合集【gson-2.8.1.jar,gson-2.8.1-sources.jar】, 包含Gson核心包和源码包。