杰克逊 - 递归替换匹配的字段

时间:2014-02-17 21:41:26

标签: java json jackson fasterxml

鉴于以下内容(从POJO序列化),我需要根据字段名称加密字段列表的每次出现,无论其深度如何。作为一个例子,我想加密文档的某些部分进行存储(密码和数量订单)。

我已经处理了加密片,但是寻找一种好的方法来遍历JsonNode,找到匹配字段的每一个匹配并加密/替换它。

隐藏(例如,通过@JsonIgnore,无法解决问题,因为我需要存储数据)。这适用于某些系统数据的脱机文件备份。

请注意,在我想要匹配的字段(passsword和quantityOrdered)中,它们的类型不同,密码会在不同级别多次出现。

{
  "name":"foo",
  "id":"123456",
  "password":"bar",
  "communities": [
    {
      "name":"administrators",
      "location":"xyz",
      "password":"baz"
    },
    {
      "name":"members",
      "location":"xyz",
      "password":"baz"
    }
  ],
  "quantityOrdered": 35
}

我看到使用树模型的例子意味着知道文档的结构。我看到JsonNode.getElements()可用于获取名称的所有元素,但它只返回值,而不是键。有经验的人可以推荐一个好的方法。

1 个答案:

答案 0 :(得分:0)

您可以使用Custom JsonFilter,并覆盖serializeAsField方法。

@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov, BeanPropertyWriter writer) throws Exception {
    if (writer.getName().equals("name")) {
        // encrypt the value
    } else {
        // The property will not be filtered
        writer.serializeAsField(bean, jgen, prov);
    }
}