How to allow Jackson to deserialize nested objects into a custom deserializer

In my project, I have JsonDeserializerto deserialize abstract types in collections. Now I have a type that has a property Collection. How can I advise Jackson to deserialize the nested collection for me, and not do it myself?

interface Person {
    String getName();
    void setName(String name);
}

class LonelyPerson implements Person { ... }
class SocialPerson implements Person {
    private List<Person> friends;
    ...
}

public class SocialPersonDeserializer extends JsonDeserializer<Person> {
    public Person deserialize(final JsonParser jp, final DeserializationContext ctx) throws IOException {
        ObjectCodec codec = jp.getCodec();
        JsonNode jsonNode = codec.readTree(jp);

        String name = jsonNode.get("name").asText();
        SocialPerson sp = new SocialPerson();
        p.setName(name);

        JsonNode friends = jsonNode.get("name").asText();
        for (JsonNode friendNode : friends) {
            sp.getFriends().add(/* How to desialize another person?? */);
        }
    }
}
+4
source share
1 answer

In this case (ok this is old, but for someone it might be of help) you actually have a nested recursive object, so you can just extract the code to deserialize the person on Node and repeat his call newNodes same function

Sort of

public class SocialPersonDeserializer extends JsonDeserializer<Person> {
    public Person deserialize(final JsonParser jp, final DeserializationContext ctx) throws IOException {
        ObjectCodec codec = jp.getCodec();
        JsonNode jsonNode = codec.readTree(jp);

       SocialPerson sp = deserializePerson(jsonNode);
       JsonNode friends = jsonNode.get("name").asText();
       for (JsonNode friendNode : friends) {
            sp.getFriends().add(deserializePerson(friendNode));
       }
       return sp;
   }

    protected SocialPerson deserializePerson(JsonNode jsonNode){
        String name = jsonNode.get("name").asText();
        SocialPerson sp = new SocialPerson();
        sp.setName(name);
       //other code, you could want to pass the codec or the parser to the method too
        return sp;
    }
}
-1

All Articles