java中无类型信息的JSON反序列化列表

java中无类型信息的JSON反序列化列表,java,json,serialization,gson,Java,Json,Serialization,Gson,无法修改类结果。Json没有列表的类型信息,Json无法解析 假设我们不能改变这些类别,我们将如何解决这个问题?考虑有多个不同类型的列表时的情况。 如果列表包含多种类型的对象,该怎么办 解析JSon时,您希望它具有特定的结构。例如,您希望结果对象包含顺序,而不是字符串或其他内容。因此,解析器必须足够智能,以确定列表中可以包含哪些类型的对象。除非将集合参数化,否则无法知道这一点。人们相信所有java泛型信息都会在编译时被删除。事实并非如此。例如,Gson使用泛型来确定如何解析特定的列表值。因此,如

无法修改类结果。Json没有列表的类型信息,Json无法解析

  • 假设我们不能改变这些类别,我们将如何解决这个问题?考虑有多个不同类型的列表时的情况。
  • 如果列表包含多种类型的对象,该怎么办

  • 解析JSon时,您希望它具有特定的结构。例如,您希望结果对象包含顺序,而不是字符串或其他内容。因此,解析器必须足够智能,以确定列表中可以包含哪些类型的对象。除非将集合参数化,否则无法知道这一点。人们相信所有java泛型信息都会在编译时被删除。事实并非如此。例如,Gson使用泛型来确定如何解析特定的列表值。因此,如果您使用的是GSon解析器和
    List
    ,那么不同的列表类型没有问题

    处理不同的列表项类是另一回事。如果可以更改Json数据,则可以为每个列表项编码类名及其字段。如果您绝对不能更改数据类,那么您必须将json解释为分层键值对的集合,并自己进行反序列化

    也许这条线会有帮助

    class Result {
      private List orders;// Holds objects of class Object only.
      private Number a;
      private Number b;
    }
    
    class Order {
      private Number oid;
      private Number status;
    }
    
    public class TestClass {
    public static void main(String... args){
        String testString = "{\"orders\":[{\"oid\":\"347\",\"status\":\"1\"},{\"oid\":\"348\",\"status\":\"1\"}],\"a\":14.15,\"b\":0}";
        Gson gson = new GsonBuilder().create(); 
        Result res = gson.fromJson( testString, Result.class );
    }