【问题标题】:Jackson: Returning just part of the response杰克逊:只返回部分响应
【发布时间】:2014-07-11 15:24:43
【问题描述】:

目前服务响应如下:

{
    "values": [
        {
            "field1": "value",
            .................

        },
        {
            "field1": "value",
            .................

        }
   ]
   metadata1:[],
   metadata2:"-"
}

但只想发送值数组作为响应。像这样

[
 {
   "field1": "value",
    .................   
 },
 {
   "field1": "value",
   ................
 }
]

我可以在@JsonIgnoreProperties 的帮助下隐藏元数据信息。但是回复还是这样的:

{
        "values": [
            {
                "field1": "value",
                .................

            },
            {
                "field1": "value",
                .................

            }
       ]
    }

我该如何解决?

【问题讨论】:

  • 您目前拥有的有什么问题? (隐藏元数据)你有一个很好的对象表示。该对象将有一个名为 values 的字段,该字段将是 JSON 数组中表示的对象的列表。这正是您想要使用的 JSON 风格。
  • 消费者期望得到一个 JSON 数组作为回报。此响应返回一个 JSON 对象。实际上,这更多的是向后兼容性问题,因此不能指望消费者更改他们的代码。

标签: java json jackson


【解决方案1】:

使用the @JsonValue annotation 很容易实现,它可以改变你的java 类的表示。只需将使用此注释注释的方法添加到返回值集合的响应类中。这是一个例子:

public class JacksonValue {
    public static class Bean {
        private final List<String> values;

        public Bean(List<String> values) {
            this.values = values;
        }

        @JsonValue
        public List<String> getValues() {
            return values;
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        Bean bean = new Bean(Arrays.asList("a", "b", "c"));

        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writeValueAsString(bean));
    }
}

输出:

["a","b","c"]

【讨论】: