java 将API响应编组为带有Jackson的List< POJO>

6qqygrtg  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(98)

我无法将来自Adobe Campaign API端点的响应解析为POJO。
我正在从响应中获取数据:

String json = EntityUtils.toString(response.getEntity());

数据(经过大量编辑)如下所示:

{
  "content": [
    {
      "PKey": "@9v59tLj9c.....",
      "age": 36,
      "birthDate": "1986-04-30",
      "blackList": false,
      ...
    },
    {
      "PKey": "@9f32tLj5c.....",
      "age": 32,
      "birthDate": "1999-05-11",
      "blackList": false,
      ...
    },
    ...
  ]
}

我正在示例化一个JacksonObjectMapper并对其进行配置,以便忽略根“content”节点。

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

我尝试了许多不同的方法将数据解析到我的Profile POJO中,但都没有成功。总是有一个问题与它被 Package 在“content”节点中有关,或者是一个POJO的列表,或者其他什么。为了简洁起见,下面的代码是针对单个POJO的,但是我也尝试了List<Profile>,因为正如前面提到的,响应总是一个或多个POJO的列表。

// object mapper
Profile profile = objectMapper.readValue(json), Profile.class)
// ERROR: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "content" (class com.example.adobecampaignprototype.Profile), not marked as ignorable (0 known properties: ])

// object reader
ObjectReader objectReader = objectMapper.readerFor(Profile.class).withRootName("content");
Profile profile = objectReader.readValue(json);
// ERROR: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `com.example.adobecampaignprototype.Profile` from Array value (token `JsonToken.START_ARRAY`)

// array node
ArrayNode arrayNode = (ArrayNode) objectMapper.readTree(json).get("content");
// ERROR: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "content" (class com.example.adobecampaignprototype.Profile), not marked as ignorable (0 known properties: ])

// json node
JsonNode jsonNodeRoot = objectMapper.readTree(json);
JsonNode jsonNodeNested = jsonNodeRoot.get("content");
JsonNode jsonNodeActual = jsonNodeNested.get(0) // to get profile at index 0
JsonNode jsonNodeActualValue = jsonNodeActual.get("PKey") // to read single property

我已经尝试了以上的许多组合,但从来没有能够成功地解析配置文件或列表。我已经阅读了官方文件详尽,通过教程Baeldung和其他地方。我觉得这应该是一个简单的事情,可能有一些明显的东西,我忽略了,但不知道它是什么。将不胜感激,如果有人能指出我的EASY按钮。

9lowa7mx

9lowa7mx1#

也许你想得太多了,例如,如果你把json输入文件的一个简化版本作为起点,如下所示:

{
    "content": [
        {
            "PKey": "@9v59tLj9c....."
        },
        {
            "PKey": "@9f32tLj5c....."
        }
    ]
}

您可以使用您编写的部分代码,因此反序列化它的一种方法是将JsonNodeArrayNode数组转换为Profile[]数组:

@Data
public class Profile {

    @JsonProperty("PKey")
    private String pKey;
}

ArrayNode arrayNode = (ArrayNode) mapper.readTree(json).get("content");
Profile[] profiles = mapper.convertValue(arrayNode, Profile[].class);
//ok it prints the array [{"PKey":"@9v59tLj9c....."},{"PKey":"@9f32tLj5c....."}]
System.out.println(mapper.writeValueAsString(profiles));

相关问题