如何让Jackson在自定义反序列化器中反序列化嵌套对象

时间:2014-08-19 09:06:16

标签: java json jackson json-deserialization

在我的项目中,我有一些JsonDeserializer来反序列化集合中的抽象类型。 现在我有一个具有Collection属性的类型。我怎样才能指示Jackson为我反编译嵌套集合而不是自己做呢?

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?? */);
        }
    }
}

1 个答案:

答案 0 :(得分:-1)

在这种情况下(好吧它很老但是对于某人来说它可能是一个帮助)你实际上有一个嵌套的递归对象,所以你可以简单地提取代码来反序列化Node上的一个人并迭代他的friendNodes调用它功能

这样的东西
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;
    }
}