GSON解析不确定类型序列化示例

9nvpjoqh  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(204)

在下面的例子中,我必须解析一个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
a6b3iqyw

a6b3iqyw1#

首先,JsonSyntaxException是在“错误”情况下抛出的,即要反序列化的数据与字符串数据不匹配,因此可以忽略此情况,因为其他情况将正确地反序列化字符串。那么您可能会考虑使用一些不同的方法来定义对象。当Collection将被序列化为对象而不是数组时,也可能出现这种情况,因此执行了“错误”的反序列化。
第二,从Collection(和List)派生并向派生类添加字段,GSON似乎只会序列化Collection的元素,根据这个源代码。对于这种类,您可能需要一个自定义的TypeAdapter实现来获得所需的JSON字符串。

相关问题