【问题标题】:JSON deserializing List in java with no type informationjava中的JSON反序列化列表没有类型信息
【发布时间】:2012-06-26 20:05:33
【问题描述】:
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 );
}

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

  1. 假设我们不能更改这些类,如何解决这个问题?考虑可能存在多个不同类型的此类列表的情况。
  2. 如果列表包含多种类型的对象怎么办?

【问题讨论】:

    标签: java json serialization gson


    【解决方案1】:

    在解析 JSon 时,您希望它具有一定的结构。例如,您希望 Result 对象包含 Orders 而不是字符串或其他内容。所以解析器必须足够聪明,才能弄清楚列表中可以包含哪些类型的对象。除非您对集合进行参数化,否则无法知道这一点。相信所有 java 泛型信息在编译时都会被删除。这不是真的。例如,Gson 使用泛型来确定如何解析特定的列表值。因此,如果您使用 GSon 解析器和List<Order>,则不同的列表类型没有问题。

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

    this 线程可能会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 2013-12-01
      • 2016-07-16
      • 2015-05-03
      相关资源
      最近更新 更多