[英]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.