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

问题描述 投票:0回答:1

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

java json serialization jackson
1个回答
0
投票

解决方案之一是首先将整个 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);
© www.soinside.com 2019 - 2024. All rights reserved.