繁体   English   中英

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

[英]deserialization with Jackson: get list of fields set by Json object

我想在用Jackson进行反序列化之后知道Json输入设置了哪些字段(甚至为null),所以我可以将null字段设置为null,将Json输入中未指定的字段与设置为null的地方区分开。

这个问题是在我上一个关于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;
}

示例:通过反序列化{“ myField1”:null},我想使deserializedFields = [“ myField1”],并通过反序列化{},我想要deserializedFields = []。

我已经在自定义反序列化器和BeanDeserializerModifier中进行过尝试,但仍然无法截获Json对象内的字段列表(或者,如果这样做,它已经使用了JsonParser,那么就无法反序列化)。 最好的情况下,我还将获得已设置的MyFooDto字段的反射列表...

您知道我该如何进行吗?

谢谢社区!

最直接的方法是在每个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 mapper并且下面的json是带有示例JSON的String ):

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM