Java Jackson:反序列化复杂的多态对象模型:JsonMappingException:意外的令牌(START_OBJECT),预期的VALUE_STRING

我有这种物体树

一个

B延伸A.

C延伸B

D延伸B

E延伸C.

F扩展A并且对A有一个引用

A具有以下注释

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS,include=JsonTypeInfo.As.PROPERTY,property="@class")

如果我尝试反序列化扩展A的JSON对象数组,则会引发以下错误

org.codehaus.jackson.map.JsonMappingException:意外的标记(START_OBJECT),预期的VALUE_STRING:需要包含类型id的JSON字符串(对于java.util.Collection的子类型)

json字符串由set的toString()方法生成,该set参数化为A类,其中A在JSON中序列化,代码如下:

 ObjectMapper objectMapper=new ObjectMapper(); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS); String res=""; try { res = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(t); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return res; 

反序列化json数组的代码(即上面描述的集合)是:

 ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS); Collection results=null; try { results = mapper.readValue(json, TypeFactory.defaultInstance().constructParametricType(Collection.class, clazz ) ); } catch (JsonParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JsonMappingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return results; 

它解析的json示例如下:

 "[{ "@class" : "pack1.pack2.MyClass", "id" : null, "f1" : "", "f2" : 0.9933817827, "f3" : 6.883261E-4, "f4" : 0.001375699, "f5" : { "@class" : "pack1.pack2.MyClass2", "id" : null, "f1" : "", "f2" : 0.0, "f3" : 0.0, "f4" : 0.0, "f5" : [ "java.util.HashSet", [ 0 ] ], "f6" : [ "java.util.HashSet", [ 2 ] ], "f7" : [ "java.util.ArrayList", [ "scelta", "brani", "buona" ] ], "f8" : [ null, "NOM", null ], "f9" : false }, "f10" : [ "java.util.HashMap", { "2" : "ADJ" } ], "f11" : [ "java.util.HashSet", [ 0 ] ], "f12" : [ "java.util.HashSet", [ 2 ] ], "f13" : [ "java.util.ArrayList", [ "scelta", "brani", "buona" ] ], "featureIndicator" : false }]" 

这里json字符串只包含我的java Set样本的一些对象

我相信问题在于默认输入。 JSON的开头并不像jackson所期望的默认输入那样生成。 JSON的开头应该是:

 ["java.util.HashSet", [{ 

并且结尾应该有一个额外的结束括号}]]

那是因为你使用你的集合的toString()方法生成JSON。 您应该使用使用默认类型配置的ObjectMapper ,如下所示:

 res = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(yourSet);