JSON格式更改后,使用jax-rs将JSON从REST API解析为POJO时出现问题

8aqjt8rx  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(148)

我有一个工作的REST客户端类使用javax.ws.rs.WebTarget,.Client和javax.ws.rs.core.MediaType为服务器的REST服务返回JSON字符串.不幸的是,在我相信是JSON字符串的格式更改后,我不能再通过WebTarget将结果解析为POJO,相反,我得到了“从输入流阅读实体时出错”,原因是“无法从START_OBJECT标记中反序列化myproject.pojo.Entity[]的示例”。
Entries.java:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Entity {

   private String key;

   public Entity() {}

   public String getKey() {
      return key;
   }

   public void setKey(String key) {
      this.key = key;
   }

RestClient.java 解析所有实体的www.example.com方法,其中目标是WebTarget的示例:

public Entity[] getEntities() {
   return target.path("entities").request(MediaType.APPLICATION_JSON).get(Entity[].class);
}

当使用.get(String.class)而不是POJO并将结果打印到控制台时,我看到我得到的JSON文本很好:

{ "elements": [ { "key": "key1", "name": "name1", "someAdditionalInfo": { "info1": "info1", "info2": "info2"} }, {"key:" "key2", etc...} ], "total": 23 }

我怀疑列表前后的“elements:“前缀和“total”后缀是所有这一切的原因。我尝试使用.get(new GenericEntity(){}),但结果相同。

fdbelqdn

fdbelqdn1#

您的JSON包含一个在“elements”字段中有数据的对象,而不是数组。要解析它,您需要创建一个与您的输入匹配的对象(DTO),例如:

public class EntityList {
    private Entity[] elements;
    private int total;
    ...
    // (getters, setters)
}

这里重要的是,包含数据的字段也命名为elements,以便Jackson反序列化器根据您的项相应地设置此字段。
这应该允许您获得如下结果

target.path("entities")
    .request(MediaType.APPLICATION_JSON)
    .get(EntityList.class)
    .getElements();
fruv7luv

fruv7luv2#

看起来之前的响应只包含实体列表,现在它被命名为“elements”。要修复它,您应该创建一个新的Java类来充当实体列表的 Package 器:

@JsonIgnoreProperties(ignoreUnknown = true)
public class RawResponse {
    private Entity[] elements;

    public RawResponse() {}

    public Entity[] getElements() {
        return elements;
    }

    public void setElements(Entity[] elements) {
        this.elements = elements;
    }
}

这是假设你不关心获取“total”的值,然后改变你的控制器使用新的 Package 器类:

public Entity[] getEntities() {
    return target.path("entities").request(MediaType.APPLICATION_JSON).get(RawResponse.class).getElements();
}

相关问题