我有一个想要解析的 JSON:
{
"name": "john",
}
我必须使用以下层次结构。这些类是不可变的,我必须通过静态工厂方法访问它们(这是必要的,因此建议对其中任何一个进行修改都是没有意义的Name
or Person
).
class Name {
static Name valueOf(String name) {...}
private Name() {}
String name();
}
class Person {
static Person create(Name name) {...}
private Person() {...}
Name name();
}
为此,我想反序列化Person
和杰克逊一起,所以我写了这个:
public class NameJsonDeserializer extends JsonDeserializer<Name> {
@Override public Name deserialize(JsonParser parser, DeserializationContext context) {
var tree = parser.getCodec().readTree(parser);
var name = tree.asToken().asString();
return Name.valueOf(name);
}
}
public class PersonJsonDeserializer extends JsonDeserializer<Person> {
@Override public Person deserialize(JsonParser parser, DeserializationContext context) {
var tree = parser.getCodec().readTree(parser);
var name = (ObjectNode) tree.get("name");
return Person.create(name);
}
}
但当然,这是行不通的。它甚至无法编译。
我知道我可以写类似下面的东西,但是Name
到处都可以使用,但并不总是在一个范围内使用Person
,所以我真的需要一个单独的解串器Name
.
var tree = parser.getCodec().readTree(parser);
var name = (TextNode) tree.get("name");
return Person.create(Name.valueOf(name.asText()));
如何在不借助中间 POJO 的情况下进行反序列化?
我必须使用parser.getValueAsString()
for NameDeserializer
and codec.treeToValue()
for PersonDeserializer
:
public class NameJsonDeserializer extends JsonDeserializer<Name> {
@Override public Name deserialize(JsonParser parser, DeserializationContext context) {
var name = parser.getValueAsString();
return Name.valueOf(name);
}
}
public class PersonJsonDeserializer extends JsonDeserializer<Person> {
@Override public Person deserialize(JsonParser parser, DeserializationContext context) {
var codec = parser.getCodec();
var tree = codec.readTree(parser);
var name = codec.treeToValue(tree.get("name"), Name.class);
return Person.create(name);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)