杰克逊多态反序列化预计START_ARRAY

时间:2014-10-08 07:34:47

标签: java json jackson polymorphism

我需要像这样deserializa一个Json:

{  
   "arrayObj1":[  
      {  
         "type":"t1",
         "value":[  
            {  
               "value1":"a"
            },
            {  
               "value2":"b"
            }
         ],
         "otherInfo":"abc"
      }
   ]
}

这就是我尝试这样做的方式:

public class ClassA{
private ArrayObj1[] arrayObj1;}

则...

    public class ArrayObj1 extends Value{
    private String type;
    private Value [] value;

 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
                  include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
                  property = "type")
    @JsonSubTypes(value={
            @JsonSubTypes.Type(value = T1.class, name = "t1")
    })
    public void setValue (Value [] value){
        this.value = value;
    }
}

和...

public abstract class Value {}

这是我得到的错误: com.fasterxml.jackson.databind.JsonMappingException:意外的令牌(START_OBJECT),预期的START_ARRAY:需要JSON数组来包含类的As.WRAPPER_ARRAY类型信息......等等

如何处理?感谢。

编辑:这是我反序列化的方式:

public ClassA getObj (String jsonString) {
    ClassA obj = null;
    try {
        obj = new ObjectMapper().readValue(jsonString, ClassA.class);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return obj;
}

完整错误是:

  

com.fasterxml.jackson.databind.JsonMappingException:意外的令牌   (START_OBJECT),预计START_ARRAY:需要包含JSON数组   类的.WRAPPER_ARRAY类型信息.Value at [来源:   java.io.StringReader@4317b868; line:1,column:496](通过   参考链:.ClassA [" arrayObj1"] - > .ArrayObj1 [" value"])

1 个答案:

答案 0 :(得分:0)

根据您使用的结构,您实际上需要一个级别的类来包含外部类型ID。所以像这样:

public class ClassA {
  private ValueWrapper[] arrayObj1;
}

public class ValueWrapper {
  @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
              include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
              property = "type")
  @JsonSubTypes(value={
        @JsonSubTypes.Type(value = T1.class, name = "t1")
  }
  public Value value;

  public String otherInfo;

  // or use getters/setters in addition; left as fields for brevity
}

public abstract class Value { ... }

但是,仔细查看您的JSON,这实际上只有在您的值为POJO时才有效。如果假设该类型适用于value数组的所有元素,则没有自动化方法。 遗憾的是,您需要手动处理多态类型。