假设我有以下json:
{
"first_path": "/just/a/path",
"second_path": "/just/another/path",
"relative_path": { "$relative": "some_file" },
}
我有一个我无法修改的课程:
public class Paths {
public String first_path;
public String second_path;
public String third_path; // Can't mark this with annotations
}
我想要的是将一些自定义反序列化逻辑应用于所有字符串值,如果它们在json中看起来像{“$ ...”:“...”}。在我的例子中,我显然将基于某些逻辑将相对路径转换为绝对路径,并将绝对路径放到Paths.third_path成员。
我如何才能与杰克逊实现这一目标?
答案 0 :(得分:0)
花了几个小时后,我通过以下方式重写String反序列化找到了这样做的方法:
public class PathJsonDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
JsonToken token = parser.getCurrentToken();
if (token.equals(JsonToken.START_OBJECT)) {
// This String value looks like an object - try to parse $relative
Path path = parser.readValueAs(Path.class);
return path.$relative;
} else {
// This is normal String value
return parser.getText();
}
}
}
Path类是:
public class Path {
public String $relative;
}
应像往常一样将PathJsonDeserializer添加到mapper中。 还有其他更多的组件方法吗?对于这种情况,如果我有几个基于$的规则具有不同的逻辑。