当前位置: 首页 > 知识库问答 >
问题:

杰克逊

陆承宣
2023-03-14

我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法:

// Create a Rest template
RestTemplate restTemplate = new RestTemplate();

// Create a list for the message converters

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();

// Add the Jackson Message converter
messageConverters.add(new MappingJacksonHttpMessageConverter());

// Add the message converters to the restTemplate
restTemplate.setMessageConverters(messageConverters);

List<Station> resultList = Arrays.asList(restTemplate.getForObject(BASE_URL, Station[].class));

return resultList;

但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式:

{"success":true,"message":"Records Retrieved Successfully","data":{"totalCount":"14","stations":[{"id":"1264","station":"Station 1","idJefatura":"1","syncDate":"2013-01-24 13:20:43"}, ...] }}

所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似乎不是正确的解决方案。

有没有办法为RestTemplate指定正确的语法?

编辑:我创建了一个包装器对象,如下所示:

public class RestResponseObject {

    private boolean success;
    private String message;
    private Data data;

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public class Data {
        private int totalCount;
        private List<Station> stations;

        public int getTotalCount() {
            return totalCount;
        }

        public void setTotalCount(int totalCount) {
            this.totalCount = totalCount;
        }

        public List<Station> getStations() {
            return stations;
        }

        public void setStations(List<Station> estaciones) {
            this.stations= estaciones;
        }
    }
}

但我很难让这个对象成为通用对象,因为JSON响应中我的对象列表的键名依赖于该域对象的类。

共有1个答案

子车才捷
2023-03-14

这里有两种解决方案

  1. 您可以编写自己的反序列化器实现,解析JSON,只获取station列表并将其转换为list对象。可以在RestTemplate上设置反序列化程序。看看如何为Jackson编写定制的desrializer
  2. 您可以做的另一件事是编写一个映射Rest响应的类。此类应包含列表对象作为成员变量。然后Spring在默认情况下将转换为新类,您可以从该类中获取站点

下面是一个例子。

反应课

public class MyResponseClass {
      // other variables
     private List<Station> stations; //it getters and setters
}

在Rest客户端中

MyResponseClass response = restTemplate.getForObject(BASE_URL, MyResponseClass.class)
List<Station> resultList = response.getStations()
 类似资料:
  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 首先,我不熟悉Jython。我正在寻找一种将python代码集成到Java项目中的方法。因此我正在调查Jython。 我正在尝试将一个 json 字符串转换为 Java 对象 - 在 python 中。 首先,我一直在努力让Jython找到我的java类。由于缺乏更优雅的解决方案,我可以通过简单地执行以下操作来向前迈进: 无论如何。。。 我正在尝试以下操作: 但是,在运行时,我收到以下错误: 我不

  • 问题内容: 我可以有条件地使用@JsonUnwrapped吗?我不想在序列化过程中使用它,但想在反序列化对象时使用它。 一种实现方法是创建两个不同的类或创建一个子类,该子类仅覆盖需要在序列化和反序列化时表现不同的属性。这听起来不对。还有其他替代方法或Jackson的解决方法吗? 问题答案: 您可以使用MixIn功能。使用此要素类与注释分离。您可以使用在运行时中添加必要的注释。请参见以下示例: 上面

  • 问题内容: Spring MVC 3.1与Jackson 2.0兼容吗?Spring MVC在类路径上自动检测Jackson并将其委托给Jackson以JSON内容类型的请求是否仍然有效? 问题答案: 在Spring 3.2中添加了对Jackson 2的支持,并且还向后移植到了Spring 3.1.2(SPR-9507)

  • 我正在尝试将jboss wildfly 8配置为将Jackson用于JSON。所以我补充说 我的耳朵工程。但在部署时,我会遇到以下错误: 原因:java。lang.LinkageError:加载程序约束冲突:解析重写的方法“org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider$Proxy$\u$$WeldClien