Java 对Json对象进行反序列化的建议,该对象具有gson动态类型的某些属性
我要反序列化以下对象:Java 对Json对象进行反序列化的建议,该对象具有gson动态类型的某些属性,java,json,gson,deserialization,Java,Json,Gson,Deserialization,我要反序列化以下对象: { "qid": "226", "parent_qid": "225", "sid": "298255", "gid": "25", "type": "M", "title": "SQ001", "
{
"qid": "226",
"parent_qid": "225",
"sid": "298255",
"gid": "25",
"type": "M",
"title": "SQ001",
"question": "question text",
"preg": null,
"help": null,
"other": "N",
"mandatory": null,
"question_order": "1",
"language": "de",
"scale_id": "0",
"same_default": "0",
"relevance": "1",
"modulename": "",
"available_answers": "No available answers",
"subquestions": "No available answers",
"attributes": "No available attributes",
"attributes_lang": "No available attributes",
"answeroptions": "No available answer options",
"defaultvalue": null
}
具有以下类型的成员:
private HashMap<String, String> available_answers;
private HashMap<Integer, SubQuestion> subquestions;
私有HashMap可用\u答案;
私有HashMap子问题;
我的问题是,在某些情况下,“answeroptions”和“available_answers”(可能不止一个或两个)属性不仅仅是字符串,而是其他对象
A) 我读过关于创建自定义反序列化程序来处理此类情况的内容,但这将导致我还必须使用静态类型(更多不必要的代码)反序列化其他属性的情况
B) 我想到的另一种方法是,我可以“反序列化”JSONObject的属性,并在相应的getter中完全反序列化它们
所以我的问题是,你能否建议我采用a)、b)或其他方法
提前问候和感谢 如果这些字段只有字符串JSON值,而没有值,则可以使用和自定义:
/**
*仅用于带有{@code@JsonAdapter}注释的字段。
*/
公共类StringAsNullTypeAdapterFactory实现TypeAdapterFactory{
@凌驾
公共类型适配器创建(Gson Gson,TypeToken类型){
TypeAdapter委托=gson.getAdapter(类型);
返回新的TypeAdapter(){
@凌驾
public void write(JsonWriter out,对象值)抛出IOException{
//如果您需要,您必须执行此操作
//还要编写JSON数据
抛出新的UnsupportedOperationException();
}
@凌驾
公共T读取(JsonReader in)引发IOException{
if(in.peek()==JsonToken.STRING){
in.skipValue();//跳过字符串
返回null;
}
返回delegate.read(in);
}
};
}
}
然后,您可以像这样使用TypeAdapterFactory:
课堂测验{
公共字符串qid;
公共字符串parent_qid;
// ...
@JsonAdapter(StringAsNullTypeAdapterFactory.class)
公共HashMap可用的\u答案;
@JsonAdapter(StringAsNullTypeAdapterFactory.class)
公共HashMap子问题;
}
然后像往常一样使用Gson实例,不需要进一步的配置。对于(a)您不需要为整个对象写反序列化,您可以按字段反序列化。我认为(a)更好。这是一个基于观点的问题,你能控制JSON结构吗?在我看来,根据上下文的不同,字段的值是不同的类型似乎是一种代码味道。不,JSON结构来自API。@Eklavya谢谢你的回答。你能再给我一个提示吗?我只找到了关于使用自定义反序列化器或typeadapter对自己的类和默认类进行自定义反序列化的信息,而不是像我使用的一般集合。如果JSON字段是一个字符串,我认为最好的方法是将例如available_answers设置为null。