Jackson - 使用treeToValue时在Json节点中处理文本?

时间:2014-02-28 14:12:49

标签: java json jackson

我有一些代码需要输入json并使用Jackson和“treeToValue”方法将其转换为简单的java类(pojo),much like the example here

   MyBean bean = mapper.treeToValue(node, MyBean.class);

我希望能够处理json中所有节点值的文本,以扫描可能的XSS攻击,并根据需要对HTML进行编码。

无论如何使用treeToValue执行此操作?或者readValue很容易?我想添加一个排序回调,这样当解析一个节点值时,它允许我按照我认为合适的方式更改节点文本。我查看了源代码,我想我可能需要派生一个自定义的TreeTraversingParser才能很好地执行此操作,并覆盖“getText”....

有什么更好的建议吗?

1 个答案:

答案 0 :(得分:1)

事实证明,这可以使用自定义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);