繁体   English   中英

Jackson在Json响应中显示字段

[英]Jackson Displaying fields in Json response

自最近两天以来,我一直在努力解决一个问题。 我有一个Integer对象和一个Float对象,如果它是0 ,我不想在JSON响应中显示。 我正在尝试使用@JsonInclude(value=Include.NON_NULL)来实现这一点,但是它似乎没有用。

有人有什么建议可以解释我在这里做错了什么吗?

可以说模型类是这样的:

@JsonInclude(value = Include.NON_NULL)
public class myClassInfo {

    String                originalQuery;
    String                normalizedQuery;
    Long                  id;
    Integer               performanceStatus;
    Float                 atcPercentage;
    Integer               ruleOn;
    Integer               ruleOff;
}

我有相应的getter和setter方法。 我只想显示atcPercentageruleOnruleOff除非它不为0 我该怎么做? 我希望这种解释有助于理解我的问题。 我试过NON_NULL ,它似乎没有用。 我的理解是,如果我在类的开头定义了JsonInclude ,那应该适用于所有字段。 如果我错了,请纠正我。

您可以编写自己的过滤器并按以下方式使用它:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ClassInfo classInfo = new ClassInfo();
        classInfo.setId(0L);
        classInfo.setAtcPercentage(0F);
        classInfo.setPerformanceStatus(0);

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

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = ZeroNumberFilter.class)
class ClassInfo {

    private Long id;
    private Integer performanceStatus;
    private Float atcPercentage;

    // getters, setters
}

class ZeroNumberFilter {

    @Override
    public boolean equals(final Object obj) {
        if (obj instanceof Number) {
            final Number number = (Number) obj;
            return Double.compare(number.doubleValue(), 0) == 0;
        }

        return false;
    }
}

打印{} -空对象。 当我们将所有值更改为1 ,它会打印:

{"id":1,"performanceStatus":1,"atcPercentage":1.0}

Include.NON_NULL仅过滤具有null值的属性。 您可以使用Include.NON_DEFAULT但是在这种情况下,您应该更改POJO并为所有字段声明默认值:

@JsonInclude(value = JsonInclude.Include.NON_DEFAULT)
class ClassInfo {

    private Long id = 0L;
    private Integer performanceStatus = 0;
    private Float atcPercentage = 0F;

    // getters, setters
}

但是,如果您的业务逻辑依赖于某个地方的null值,则此解决方案可能会有一些缺点。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM