0

我有一个 JSONObject 类似于:

  {
   "name": "John",
   "details": [
      [
       "phone",
       123456789
      ],
      [
       "address",
       "abcdef"
      ]
   ]
}

我正在尝试将上面的 JSON 映射到以下对象:

 @JsonIgnoreProperties(ignoreUnknown = true)
 public class Employee{
       String name;
       List<List<DetailItem>> details;


       public String getName() {
       return name;
       }
       public void setName(String name) {
      this.name = name;
       }
       public List<List<DetailItem>> getDetails() {
      return details;
       }
       public void setDetails(List<List<DetailItem>> details) {
      this.details = details;
       }

    }


     @JsonSubTypes({
       @JsonSubTypes.Type(value=String.class),
       @JsonSubTypes.Type(value=Integer.class)
       })
    public class DetailItem{

    }

映射使用:

     ObjectMapper mapper = new ObjectMapper();
     mapper.readValue(instream, Employee.class)

例外:

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, DetailItem] from String value; no single-String constructor/factory method (through reference chain: Employe["details"])

我正在尝试按原样进行多态反序列化,DetailItem或者StringInteger

谢谢

4

1 回答 1

1

这根本不是多态反序列化的工作原理!您忽略了多态性的定义,并试图神奇地创建不相关的类之间的关系。即使它没有明确强制执行,带有注释的类型@JsonSubTypes也应该是每个已定义@Types 的父类。

@JsonSubTypes({
    @Type(value=String.class), // String is not a subclass of DetailItem!
    @Type(value=Integer.class) // Integer is not a subclass of DetailItem!
})
public class DetailItem{
}

根本问题是设计非常粗制滥造的 JSON 输入。我什至不会问为什么每个detail属性都被非规范化并存储到单独的数组中,但我强烈建议将格式修复为更明智的格式。例如:

{
    "name": "John",
    "details": {
        "phone" : 123456789,
        "address" : "abcedf",
    }
}

以上可以简单地反序列化为以下对象:

class Employee {
    private Sting name;
    private Map<String, Object> details;

    // constructor, getters/setters
}

如果您坚持使用当前格式,则要么更改List<List<DetailItem>>List<List<Object>>,要么实现自定义反序列化器。

于 2013-05-10T22:13:38.057 回答