提问人:Alex CC 提问时间:10/27/2023 更新时间:10/28/2023 访问量:36
搜索 JSON 响应以查找和反序列化 JSON 对象
Search JSON response to find and deserialize JSON object
问:
我正在尝试使用 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 可以匹配我的目标对象的一个或多个字段名称(例如上面示例中的“name”)。
我想要的方法是在 JSON 中搜索包含一组必填字段的对象,然后尝试将其作为我的对象进行去消毒。但不知道如何实现这一目标......
我尝试过使用所需属性的注释来提升 ObjectMapper:.@JsonProperty(value = "user", required = true)
答:
0赞
Raymond Choi
10/28/2023
#1
其中一个解决方案是将整个 JSON 反序列化为 first。然后使用JSON库进行搜索和转换,然后再转换为POJO。JsonNode
JsonNode
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);
评论