2014-10-08 40 views
0

我需要deserializa一个JSON这样的:杰克逊多态反序列化预期START_ARRAY

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

这就是我如何努力做到这一点:

public class ClassA{ 
private ArrayObj1[] arrayObj1;} 

则...

和...

public abstract class Value {} 

这是错误IV得到: 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数组,包含 As.WRAPPER_ARRAY类的信息,类的值为[来源: [email protected];行:1,柱:496](通过 参考链:.ClassA [ “arrayObj1”] - > ArrayObj1 [ “值”])

+0

您使用什么代码来实际执行反序列化?什么是完整的错误信息?这些东西将有助于调试您的问题。 – 2014-10-08 07:44:16

+0

嗨,即时通讯不知道,但这是我如何反序列化,我编辑帖子。 – LinkOut 2014-10-08 07:45:40

回答

0

鉴于使用的结构中,实际需要的多一个水平包含外部类型标识的类。因此,像这样:

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阵列的所有元素,则没有自动化的方法来完成此操作。 您将不得不手动处理多态类型。

+0

所以,如果值数组是一个POJO数组,所有来自同一个“类型”我无法处理它与杰克逊? – LinkOut 2014-10-09 06:33:22

+0

嗯...我不明白你的答案反正... – LinkOut 2014-10-09 07:05:39

+1

简短的回答是不,你不能使用JSON结构化的方式'@ JsonTypeInfo'。 'type'必须为每个值,而不是数组。 – StaxMan 2014-10-09 17:29:43