Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson反序列化使用自定义方法扩展特定类的嵌套对象_Java_Json_Gson_Deserialization_Pojo - Fatal编程技术网

Java Gson反序列化使用自定义方法扩展特定类的嵌套对象

Java Gson反序列化使用自定义方法扩展特定类的嵌套对象,java,json,gson,deserialization,pojo,Java,Json,Gson,Deserialization,Pojo,我有一个抽象类,如下所示 公共抽象类IndexedPojo{ 列表键集; 公共列表getKeySet(){ 返回键集; } 公共无效设置键集(列表键集){ this.keySet=keySet; } public void setKeySet(JsonObject参数){ this.keySet=newarraylist(parameters.keySet()); } public void setKeySet(映射参数){ this.keySet=newarraylist(parameters

我有一个抽象类,如下所示

公共抽象类IndexedPojo{
列表键集;
公共列表getKeySet(){
返回键集;
}
公共无效设置键集(列表键集){
this.keySet=keySet;
}
public void setKeySet(JsonObject参数){
this.keySet=newarraylist(parameters.keySet());
}
public void setKeySet(映射参数){
this.keySet=newarraylist(parameters.keySet());
}
}
此抽象类的目的是提供跟踪已在扩展此抽象类的类中初始化的变量的功能。为什么我需要这个?我正在为测试自动化项目中使用的表单建模pojo类。其中一些参数是可选的,如果尚未初始化,则不会填充相应的表单元素。目前,我正在使用此方法创建扩展
IndexedPojo
类的类实例:

publicstatict反序列化json(JsonObject参数,类tClass){
Gson Gson=新的Gson();
T instance=gson.fromJson(参数,tClass);
setKeySet(参数);
返回实例;
}
但是现在的问题是,一些嵌套的子类也是扩展IndexedPojo的类,我想用同样的方式初始化它们。比如说

公共类RuleSetConfigForm扩展了IndexedPojo{
@序列化名称(“键”)
SomeNestedConfig nestedConfig;
}
public类SomeNestedConfig扩展了IndexedPojo{
@SerializedName(“某个键”)
私有字符串someOptionalParamater1=“”;
@SerializedName(“某些键2”)
私有字符串someOptionalParamater2=“”;
@SerializedName(“某些键3”)
私有字符串someOptionalParamater3=“”;
}

如何在初始化
规则集配置表单时初始化嵌套的
SomeNestedConfig nestedConfig
?是否有自动执行此操作的方法?

可以使用自定义方法解决此问题,该方法将委托给默认适配器,然后调用您的
IndexedPojo.setKeySet(…)
方法:

类IndexedPojoTypeAdapterFactory实现TypeAdapterFactory{
公共静态最终IndexedPojoTypeAdapterFactory实例=新IndexedPojoTypeAdapterFactory();
私有IndexedPojoTypeAdapterFactory(){}
公共类型适配器创建(Gson Gson,TypeToken类型){
//仅处理IndexedPojo和子类
如果(!IndexedPojo.class.isAssignableFrom(type.getRawType())){
返回null;
}
//将默认适配器作为委托获取
//由于在方法开始时进行了“type”检查,所以Cast是安全的
@抑制警告(“未选中”)
TypeAdapter delegate=(TypeAdapter)gson.getDelegateAdapter(this,type);
//强制转换是安全的,因为'T'是IndexedPojo或子类(由于方法开始时的'type'检查)
@抑制警告(“未选中”)
TypeAdapter=(TypeAdapter)新的TypeAdapter(){
@凌驾
public void write(JsonWriter out,IndexedPojo值)引发IOException{
委托。写出(输出、值);
}
@凌驾
public IndexedPojo read(JsonReader in)引发IOException{
//从JsonReader读取JsonObject,以便能够将其传递给`IndexedPojo.setKeySet(…)`
//后来
//注意:JsonParser会在宽松模式下自动解析,这是无法禁用的
//注意:可能必须添加JSON空值的处理
JsonObject JsonObject=JsonParser.parseReader(in.getAsJsonObject();
IndexedPojo值=委托。来自JSONTREE(jsonObject);
value.setKeySet(jsonObject);
返回值;
}
};
返回适配器;
}
}
然后在
反序列化json(…)
方法中使用此工厂:

publicstatict反序列化json(JsonObject参数,类tClass){
//注意:还可以将Gson实例存储在“static final”字段中
Gson Gson=new GsonBuilder()
.registerTypeAdapterFactory(IndexedPojoTypeAdapterFactory.INSTANCE)
.create();
返回gson.fromJson(参数,tClass);
}

这项工作非常完美。多亏了你,我的代码变得灵活多了