Gson——循环引用的解决方案
来源:互联网 发布:我国网络社会治理方针 编辑:程序博客网 时间:2024/06/07 03:02
Gson本身并不提供循环引用的直接解决方案。我们可以通过以下方式来解决循环引用的问题:
使用ava关键字transient
private transient int value = 3;
在序列化的时候value不会生成到json字符串中。
一起jquery,17jquery
使用Gson提供的注解@Expose 一起jquery,17jquery
@Excludeprivate String value;
当然,要使用这个属性必须通过以下语句来构造Gson对象
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() 一起jquery,17jquery
我们也可以自定义注解来标注需要过滤的属性,参见官方的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; } } 一起jquery,17jquery
我们可以通过类级别和属性级别来过滤属性。以上提到的关于自定义注解的实现是在属性级别上实现的。具体方法是
public boolean shouldSkipField(FieldAttributes f) { // Foo是一个自定义注解 return f.getAnnotation(Foo.class) != null; }
内容来自17jquery
一般情况下,我们可以通过根据属性名的判断来实现实现逻辑过滤。当然,在序列化之前,需要用一下代码来构造Gson对象:
一起jquery,17jquery
Gson gson = new GsonBuilder() .setExclusionStrategies(new MyExclusionStrategy(SomeObject.class)) .create(); 一起jquery,17jquery
自定义序列化器 一起jquery,17jquery
在有些情况下,我们可能会为某一个类来绑定一种序列化或反序列化器。 一起jquery,17jquery
public class MyAdaper1 implements JsonSerializer<DataStore> {@Overridepublic 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;}} 内容来自17jquery
定义一个排除模型:
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> {@Overridepublic 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);}} 一起jquery,17jquery
- Gson——循环引用的解决方案
- Gson——循环引用的解决方案
- Gson——循环引用的解决方案
- Gson——Hibernate关联类引发的循环引用的解决方案
- Gson Advanced — 映射循环引用
- iOS开发——Block引起循环引用的解决方案
- iOS开发——Block引起循环引用的解决方案
- 循环引用和解决方案
- java.lang.IllegalStateException: circular reference error Gson循环引用
- iOS开发——Block循环引用问题的解决
- Swift常见引用循环及解决方案
- Block的循环引用
- 循环引用的讨论
- 循环引用的处理
- Block的循环引用
- 循环引用的block
- UITableViewHeaderFooterView的循环引用
- java的循环引用
- 向量
- C迷宫源代码
- 求素数
- C#基础之控件名称缩写规范
- Extjs4.0客户端与服务器端代理类结构图以及store详解
- Gson——循环引用的解决方案
- How to use ppt to make an effective presentation
- 12种JavaScript MVC框架之比较
- 为什么脚本中存在错误的用户名、密码或者校验密码时回放仍然能成功回放!
- java操作properties文件
- STL之五:set/multiset用法详解
- iOS上生成圆角图片
- linux find
- 解决ubuntu11.04中文版 pppoeconf找不到网卡