java - 使用 Jackson 进行反序列化 : get list of fields set by Json object

标签 java spring-boot jackson deserialization json-deserialization

我想知道在使用 Jackson 反序列化后,Json 输入设置了哪些字段(甚至为 null),这样我就可以将 null 字段与 Json 中未指定的字段区分开来。

这个问题是在我的 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;
}

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

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

你知道我该如何继续吗?

感谢社区!

最佳答案

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

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

并且在MyFooDto setter 中,例如:

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

如果有数百个这样的 setter,那么工作量就很大。对于这种情况,另一种方法是首先将 JSON 解析为树,遍历它以获取要添加到集合中的 JSON 属性名称,然后将树转换为 MyFooDto。例如。 (假设您有一个 ObjectMapper 映射器,并且下面的 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);

关于java - 使用 Jackson 进行反序列化 : get list of fields set by Json object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48663689/

相关文章:

java - JPA DELETE 操作中的一对多关系不起作用

java - 使用jackson反序列化json以纠正子类类型

java - 将 JSON 名称映射到 Java 类字段/方法(Jackson Parser)

java - 在异步 Thrift 客户端中传递 URI/上下文路径

java - 基于对象属性的 JAXB 元素名称

Java正则表达式找不到匹配项

java - 如何启用 Hystrix DEBUG 级别的日志记录

java - java中如何将消息从工作线程传递到GUI

java - Spring 自动创建属性文件

java - 使用 Jackson 覆盖 JsonNode