Джексон JsonInclude.Include.NON_NULL не работает с пользовательским сериализатором - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть собственный сериализатор, который расширяет JsonSerializer<T> и в ObjectMapper я включил setSerializationInclusion(JsonInclude.Include.NON_NULL).

Я все еще вижу в ответ поле null.

В настоящее времяЯ игнорирую их, проверяя null для каждого свойства.У меня есть почти 15 объектов, и очень трудно добавить проверку null к каждому свойству.Используемый мной объект является общим для моих приложений, поэтому я использую пользовательский сериализатор для именования свойств

@Override
public void serialize(Person personBean, JsonGenerator jgen, SerializerProvider provider) throws IOException {
   if(personBean.getFirstName() != null){
      jgen.writeStringField("firstname", personBean.getFirstName() );
   }

   //etc...
}

Как избежать null проверять каждое свойство и реализовывать некоторый общий код, чтобы избежатьnull значений в моем сериализованном ответе.

1 Ответ

0 голосов
/ 15 февраля 2019

К сожалению, когда мы пишем пользовательский сериализатор, нам нужно позаботиться о null значениях самостоятельно.Чтобы сделать его хотя бы немного лучше, мы можем добавить новый метод writeStringField и использовать его.Например:

class PersonJsonSerializer extends JsonSerializer<Person> {

    @Override
    public void serialize(Person value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        writeStringField(gen, "firstname", value.getFirstName());
        gen.writeEndObject();
    }

    private void writeStringField(JsonGenerator gen, String fieldName, String value) throws IOException {
        if (value != null) {
            gen.writeStringField(fieldName, value);
        }
    }
}

Если вам нужно изменить только имена свойств, вы можете использовать опцию PropertyNamingStrategy.Существует несколько возможностей, таких как:

  1. LOWER_CASE - Соглашение об именовании, в котором все слова логического имени указаны в нижнем регистре, и между словами не используется разделитель.
  2. KEBAB_CASE - Соглашение об именах, используемое в таких языках, как Лисп, где слова пишутся строчными буквами, разделенными дефисами.
  3. Для получения дополнительной документации см.

Пример ObjectMapper Настройка может выглядеть следующим образом:

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);

Если нет предопределенной стратегии, которая удовлетворяет вашим потребностям, вы можете использовать аннотацию JsonView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...