在我的项目中,我有一些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?? */);
}
}
}
答案 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;
}
}