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);