在下面的例子中,我必须解析一个json字符串,它是一个对象的序列化,该对象可能是CustomClass_1或CustomClass_2的示例,我事先并不知道它。问题如下:
- 我得到一个异常com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:应为开始_OBJECT,但实际为BEGIN_ARRAY
- GSON从CustomClass_2示例中生成的json字符串只是字符串 [“item”],就好像该对象只是超类 ArrayList 的一个示例一样
有什么建议可以实现我的愿望吗?
class CustomClass_1 {
String type;
CustomClass_1(){
type = "CustomClass_1";
}
}
class CustomClass_2 extends ArrayList<String> {
String type;
CustomClass_2(){
super();
type = "CustomClass_2";
this.add("item");
}
}
public class DeserializationTest {
@Test
public void testIncomingMessageParsing(){
String serialized_object = receive();
CustomClass_1 cc1 = null;
CustomClass_2 cc2 = null;
try{
cc1 = (new Gson()).fromJson(serialized_object, CustomClass_1.class);
} catch (Exception e){
e.printStackTrace();
}
try{
cc2 = (new Gson()).fromJson(serialized_object, CustomClass_2.class);
} catch (Exception e){
e.printStackTrace();
}
if (cc1 != null && cc1.type.equals("CustomClass_1")) {
System.out.println("It's a CustomClass_1.");
} else if (cc2 != null && cc2.type.equals("CustomClass_2")) {
System.out.println("It's a CustomClass_2.");
}
}
String receive(){
CustomClass_1 cc1 = new CustomClass_1();
CustomClass_2 cc2 = new CustomClass_2();
String serialized_object = "";
Gson gson = new Gson();
boolean head = (new Random()).nextBoolean();
if (head){
serialized_object = gson.toJson(cc1);
} else {
serialized_object = gson.toJson(cc2);
}
return serialized_object;
}
} // end of class
1条答案
按热度按时间a6b3iqyw1#
首先,
JsonSyntaxException
是在“错误”情况下抛出的,即要反序列化的数据与字符串数据不匹配,因此可以忽略此情况,因为其他情况将正确地反序列化字符串。那么您可能会考虑使用一些不同的方法来定义对象。当Collection
将被序列化为对象而不是数组时,也可能出现这种情况,因此执行了“错误”的反序列化。第二,从
Collection
(和List
)派生并向派生类添加字段,GSON似乎只会序列化Collection
的元素,根据这个源代码。对于这种类,您可能需要一个自定义的TypeAdapter
实现来获得所需的JSON字符串。