我有一些代码,它需要一些输入 JSON 并使用 Jackson 和“treeToValue”方法将其反序列化为一个简单的 Java 类(POJO),非常类似于此处的示例:
MyBean bean = mapper.treeToValue(node, MyBean.class);
我希望能够处理 JSON 中所有节点值的文本,以扫描可能的 XSS 攻击,并根据需要对 HTML 进行编码。
有没有办法可以轻松地使用 treeToValue 或 readValue 来做到这一点?我只想添加某种回调,以便在解析节点值时,它允许我根据需要更改节点文本。我查看了源代码,我想我可能必须派生一个自定义 TreeTraversingParser 才能很好地完成此操作,并覆盖“getText”。
还有更好的建议吗?
事实证明这可以使用自定义 ObjectMapper 来完成!
public CustomObjectMapper()
{
super();
SimpleModule stringModule = new SimpleModule("StringModule", new Version(1, 0, 0, null)).addDeserializer(String.class, new CustomStringDeserializer());
registerModule(stringModule);
}
private static class CustomStringDeserializer extends JsonDeserializer<String>
{
@Override
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException
{
if (parser.getCurrentToken() == JsonToken.VALUE_STRING)
{
String text = parser.getText();
// Do whatever you want to the text here
return text;
}
}
}
然后,当您使用自定义对象映射器调用
treeToValue
时,它将使用 deserialize
方法处理您的节点。
CustomObjectMapper mapper = new CustomObjectMapper();
MyBean bean = mapper.treeToValue(node, MyBean.class);