【问题标题】:How to not send an empty collection in jackson如何不在杰克逊发送空集合
【发布时间】:2012-01-17 17:37:28
【问题描述】:

我有一个正在序列化的对象:

{
  "label" : "label",
  "proxyIds" : [ ],
  "childIds" : [ 161, 204, 206, 303, 311 ],
  "actionIds" : [ 157, 202 ],
}

那个 proxyIds 是 java 对象中的一个空(非 null)集合。

如何配置 Jackson 以完全不将该对象包含在 json 中?

我想要类似于 xml/soap 中“未包装”集合的行为,如果集合为空,则不包括在内。我不需要区分空集合和空集合,并且想减小 json 有效负载的大小。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    从 Jackson 2.0.0(2012 年 3 月 25 日)开始,您还可以使用 @JsonInclude annotation 在每个字段或每个类的基础上进行控制。

    public class MyObject {
    
        @JsonInclude(Include.NON_EMPTY)
        private List<Integer> proxyIds;
    
        ...
    }
    

    【讨论】:

    • 恕我直言,这应该是正确的答案。但我觉得值得一提的是,这个注解也可以用在一个类上。在这种情况下,它适用于所有字段。
    • 请注意,NON_DEFAULT 是 NON_EMPTY 的子集,你想要哪个取决于你的需要。如果我记得正确的话,NON_EMPTY 还会删除数组之外的空字符串属性,而 NON_DEFAULT 不会。
    【解决方案2】:

    这可能是一个长镜头,但如何使用包含并将 NON_DEFAULT 定义为包含属性。文档说:

    “表示只有值与默认设置不同的属性(即使用无参数构造函数构造 Bean 时它们具有的值)的值才会被包含。”

    所以如果默认值是一个空数组,它应该跳过它。

    类似:

    ObjectMapper mapper = new ObjectMapper();
    mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_DEFAULT);
    
    
    public class Test {
         String[] array = { };
         ....
    }
    

    http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/map/annotate/JsonSerialize.Inclusion.html

    【讨论】:

    • String[] array = ""; 不是有效的代码 - 你想写什么?
    • 已修复,本质上是想将默认值设置为空数组。
    • 注意,从jackson 2.0开始,这样做的方法是mapper.setSerializationInclusion(Include.NON_DEFAULT);
    猜你喜欢
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2022-06-22
    • 2017-08-11
    相关资源
    最近更新 更多