Java Jackson: desserializa o modelo de object polimórfico complexo: JsonMappingException: token inesperado (START_OBJECT), esperado VALUE_STRING

Eu tenho essa arvore de objects

UMA

B estende A

C estende B

D estende B

E estende C

F estende A e tem uma referência a A

A tem a seguinte anotação

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

Se eu tentar desserializar uma matriz JSON de objects que estenda A, ele lança o seguinte erro

org.codehaus.jackson.map.JsonMappingException: token inesperado (START_OBJECT), esperado VALUE_STRING: precisa de um string JSON que contenha o tipo id (para o subtipo de java.util.Collection)

A cadeia json é gerada pelo método toString () de um conjunto e o conjunto é paramétrico para o tipo A, onde A é serializado em JSON com o seguinte código:

 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; 

O código para desserializar o array json (que é o conjunto descrito acima) é:

 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; 

O exemplo de json que analisa é como:

 "[{ "@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 }]" 

Aqui a cadeia json inclui apenas alguns objects da minha amostra do java set

Eu acredito que o problema é com a digitação padrão. O início do seu JSON não é gerado como o que Jackson espera com a digitação padrão. O início do JSON deve ser:

 ["java.util.HashSet", [{ 

e o final deve ter um colchete de fechamento extra }]] .

Isso porque você gera o JSON usando o toString() do seu conjunto. Você deve usar o ObjectMapper , que é configurado com a digitação padrão, assim:

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