在Java中反序列化JSON对象

时间:2014-09-30 18:53:29

标签: java json gson deserialization unmarshalling

我有一个Java Web服务响应作为一个对象,它有一个整数作为键,自定义对象作为值的映射。自定义对象又包含另一个自定义对象的列表。当我尝试反序列化响应时,除了自定义对象列表之外,所有内容都被反序列化。列表是空的。

我的代码:

String dataFromServer ="";
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
Type listType = new TypeToken<OuterCustomResponse>() {}.getType();


OuterCustomResponse respo = gson.fromJson(data, Books.class);

OuterCustomResponse具有以下结构:

OuterCustomResponse {
    private int age;
    private String name;
    private Map<Integer,CutomObj1> obj;
}

CtomObj1 {
    List<CustomObj2> customObj2;
}

问题是响应包含年龄,名称和地图对象,但在地图对象中,列表为空。我尝试通过实现JSON反序列化器为CustomObj2编写反序列化器,但没有用。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

使用一些示例JSON会更好。 (我猜你也有错字CtomObj1 {...

也许customObj2不是一个对象而不是一些原始类型(?不太可能)或者你的列表是一个关联的数组(=对象)因此你得到了一个复杂的对象而不是列表/数组?

如果它是一个关联的数组(〜对象),看起来就像一个列表:

OuterCustomResponse { 
  age:3, 
  name:"foo", 
  map:{ 
    1:{ 
      listitem1a:{...}, 
      listitem2a:{...}}, 
    2:{}, 
    ... 
}}

您可能必须从这三个选项中进行选择以进行反复序列化:https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Collection-with-Objects-of-Arbitrary-Types

如果它确实是一个列表((索引)数组):

OuterCustomResponse { 
  age:3, 
  name:"foo", 
  map:{ 
    1:[ 
      { listitem1propertyA: "bar" }, 
      { listitem2propertyB: "baz" }
    ], 
    2:[], 
    ... 
}}

列表项可以是相同或不同的类型。

如果它们属于同一类型,那么如果listitem1propertyA正确映射到某个CustomObj2.listitem1propertyA字段,则您的方法应该有效。

如果它们不是同一类型(或者可能只有一个特殊对象不匹配 - 我不知道这是否会导致空列表),那么您必须从上述选项中进行选择。