Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 对Json对象进行反序列化的建议,该对象具有gson动态类型的某些属性_Java_Json_Gson_Deserialization - Fatal编程技术网

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。