搜索 JSON 响应以查找和反序列化 JSON 对象

Search JSON response to find and deserialize JSON object

提问人:Alex CC 提问时间:10/27/2023 更新时间:10/28/2023 访问量:36

问:

我正在尝试使用 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)

Java JSON 序列化 Jackson

评论

0赞 v-g 10/27/2023
您是否想要一个不手动解析对象的解决方案?或者您正在寻找自动化的、特定于库的 aproach?
0赞 Alex CC 10/27/2023
理想情况下,特定于自动化库,但我目前的想法是,解析和搜索需要更多的手动对象解析,然后传递某种指向反序列化的指针。

答:

0赞 Raymond Choi 10/28/2023 #1

其中一个解决方案是将整个 JSON 反序列化为 first。然后使用JSON库进行搜索和转换,然后再转换为POJO。JsonNodeJsonNode

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