【问题标题】:How to customize json response generated by Spring HttpMessageConverters如何自定义 Spring HttpMessageConverters 生成的 json 响应
【发布时间】:2015-05-29 18:40:28
【问题描述】:

我正在使用 spring @RestController 和 HttpMessageConverter 创建一个休息 web 服务。

在我的控制器方法返回一些 POJO 并且 spring 使用“MappingJackson2HttpMessageConverter”将其转换为 JSON 的简单场景中工作正常,如下所示:

{
     "firstName": "John",
     "lastName": "Smith",
 }

但是 JSON 中的属性名称与我的 POJO 中的 getter 名称相同。我想动态修改 JSON 中的属性名称。

其实需求是根据逻辑修改JSON属性名。例如,如果条件 X,则 JSON 中的属性名称应如下所示:

{
     "fName": "John",
     "lName": "Smith",
 }

如果为 Y,则 JSON 输出中的属性名称应该是其他类似的名称:

{
     "MainName": "John",
     "SecondName": "Smith",
 }

所以属性名称不能与 pojo 绑定,我也不能使用 @jsonproperty,因为那将是编译时,但我想在运行时更改。

有没有办法覆盖 MappingJackson2HttpMessageConverter 并将我的逻辑放在那里来决定 json 属性名称?

【问题讨论】:

    标签: java json spring-mvc


    【解决方案1】:

    您可以使用@JsonAnySetter @JsonAnyGetter 注释。后面可以使用 Map 实例。如果您始终拥有一键对象,则可以使用 Collections.singletonMap 在其他情况下使用 HashMap 或其他实现。下面的例子展示了使用这种方法是多么容易:

    public class User {
    
        private Map<String, String> values;
    
        @JsonAnySetter
        public void put(String key, String value) {
            values = Collections.singletonMap(key, value);
        }
    
        @JsonAnyGetter
        public Map<String, String> getValues() {
            return values;
        }
    
        @Override
        public String toString() {
            return values.toString();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多