使用Jackson进行反序列化:获取Json对象设置的字段列表

时间:2018-02-07 12:21:56

标签: java spring-boot jackson deserialization json-deserialization

我想知道在使用Jackson反序列化后哪些字段由Json输入设置(甚至为null),所以我可以区分空字段而不是在Json中未指定的那个空字段。 / p>

这个问题出现在previous one about BeanDeserializerModifier之后。

public class Dto {
    public Collection<String> deserializedFields;
    // or even better a collection of reflection fields of the object.
}

public MyFooDto extends Dto {
    public Integer myField1;
    @PossiblySomeJacksonAnnotation (include, exclude, map on other name, special deserializer, etc...)
    public SomeDatatype myField2;
}

示例:通过反序列化{&#34; myField1&#34;:null}我想要deserializedFields = [&#34; myField1&#34;],并通过反序列化{}我想要deserializedFields = [ ]

我已经在custom deserializer and a BeanDeserializerModifier内尝试了,但我仍然无法拦截Json对象内的字段列表(或者如果我这样做,它已经使用了JsonParser并且它不能被反序列化)。 在最好的情况下,我还将获得已设置的MyFooDto字段的反射列表...

你知道我该怎么办吗?

谢谢社区!

1 个答案:

答案 0 :(得分:0)

最直接的方法是在每个setter中添加代码,将当前设置的变量名称添加到List。例如。 :

public class Dto {
    public List<String> deserializedFields = new ArrayList<>();
}

MyFooDto内部设置者:

public void setMyField1(Integer myField1) {
    deserializedFields.add("myField1");
    this.myField1 = myField1;
}

如果有数百名这样的制定者,那将是很多工作。这种情况的另一种方法是首先将JSON解析为树,遍历它以获取要添加到集合中的JSON属性名称,然后将树转换为MyFooDto。例如。 (假设您有一个ObjectMapper mapperjson下面是String,其中包含您的示例JSON):

ObjectNode tree = (ObjectNode) mapper.readTree(json);
ArrayNode deserializedFields = mapper.createArrayNode();
tree.fields().forEachRemaining(e -> deserializedFields.add(e.getKey()));
tree.put("deserializedFields", deserializedFields);
MyFooDto dto = mapper.treeToValue(tree, MyFooDto.class);