我正在尝试使用 Jackson objectMapper 反序列化 JSON 对象。我遇到的问题是这个目标对象可以包装在各种其他 JSON 中,包括一些但不是所有与我的目标匹配的字段。例如,我正在尝试反序列化和对象,例如:
public class Dog {
private String name;
private int age;
private String color;
}
来自 JSON 对象,例如:
{
"type":"animal",
"name":"pet",
"object":{
"name":"Rex",
"age":4,
"color":"brown"
}
}
或者它可能来自一个对象,例如:
{
"pet-dog":{
"name":"Rex",
"age":4,
"color":"brown"
}
}
我还设置了 @JsonIgnoreProperties(ignoreUnknown=true) ,因为我的对象有时具有不重要的可选字段。
问题有两个,首先我需要解开任意 JSON 来找到我的目标对象,任意 JSON 在请求之间会存在很大差异。其次,要解包的任意 JSON 可能与我的目标对象的一个或多个字段名称匹配(例如上面示例中的“名称”)。
我想要的方法是在 JSON 中搜索包含一组必填字段的对象,然后尝试将其作为我的对象进行反灭菌。但不知道如何实现......
我尝试使用 ObjectMapper 来获取所需属性的注释:
@JsonProperty(value = "user", required = true)
。
解决方案之一是首先将整个 JSON 反序列化为
JsonNode
。然后使用 JSON 库搜索并转换 JsonNode
,然后转换为 POJO。
https://github.com/octomix/josson
JSON 1
Josson ex1 = Josson.fromJsonString(
"{" +
"\"type\":\"animal\"," +
"\"name\":\"pet\"," +
"\"object\":{" +
" \"name\":\"Rex\"," +
" \"age\":4," +
" \"color\":\"brown\"" +
" }" +
"}");
JsonNode node = ex1.getNode("*[value[name!=null & age!=null & color!=null]]");
Dog dog = Josson.readValueFor(node, Dog.class);
JSON 2
Josson ex2 = Josson.fromJsonString(
"{" +
"\"pet-dog\":{" +
" \"name\":\"Rex\"," +
" \"age\":4," +
" \"color\":\"brown\"" +
" }" +
"}");
JsonNode node = ex2.getNode("*[value[name!=null & age!=null & color!=null]]");
Dog dog = Josson.readValueFor(node, Dog.class);