Bar*_*art 6 java json jackson json-deserialization
在我的项目中,我有一些JsonDeserializers 来反序列化集合中的抽象类型。现在我有一个有Collection属性的类型。我如何指示杰克逊为我反序列化嵌套集合而不是自己做?
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?? */);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下(好吧,它很旧,但对于某人来说可能会有帮助),你实际上有一个嵌套的递归对象,所以你可以简单地提取代码来反序列化节点上的一个人,并迭代他的朋友节点,调用相同的函数
就像是
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;
}
}
Run Code Online (Sandbox Code Playgroud)