Джексон Отображение полей в ответе Json - PullRequest
1 голос
/ 05 мая 2019

Я застрял с проблемой, которую я пытался решить с последних двух дней.У меня есть объект Integer и объект Float, которые я не хочу отображать в ответе JSON, если он равен 0.Я пытаюсь добиться этого с помощью @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 соответственно.Я хочу отобразить atcPercentage, ruleOn и ruleOff, только если это не 0.Как бы я это сделал?Я надеюсь, что это объяснение помогает в понимании моей проблемы.Я попытался NON_NULL, и это не похоже на работу.Мое понимание, если я определю JsonInclude в начале класса, это должно быть применимо ко всем полям.Поправь меня, если я ошибаюсь.

1 Ответ

0 голосов
/ 06 мая 2019

Вы можете написать свой собственный фильтр и использовать его, как показано ниже:

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;
    }
}

print {} - пустой объект.Когда мы изменяем все значения на 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значения где-то.

См. также:

...