Сериализация Джексона - игнорировать неустановленные значения, но предоставлять значения, явно равные нулю - PullRequest
0 голосов
/ 16 июня 2020

в моем приложении Spring Boot REST я действительно хочу добиться, чтобы свойства класса игнорировались Джексоном, если они не установлены явно. Но если они установлены на null, они должны быть предоставлены и сериализованы.

@JsonInclude(Include.NON_NULL) игнорирует значения null, но не делает разницы между фактически не установленными значениями и значениями, которые были явно установлены на null.

Проверьте следующий пример (с использованием Lombok), который показывает что я хочу достичь здесь:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Example {
  @JsonProperty("name")
  private String name;

  @JsonProperty("test")
  private String test;
}

Example.builder().test("test").build() должно привести к {test: "test"}
Example.builder().name(null).test("test).build() должно привести к {name: NULL, test: "test"}

Каков наилучший способ достижения что?

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Этого можно добиться с помощью Optional полей:

public class JsonTest {
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Getter
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    static class Example {
        private Optional<String> name;
        private Optional<String> test;
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module());

        Example[] examples = {
                new Example(),
                Example.builder().name(Optional.of("exampleName")).build(),
                Example.builder().name(Optional.of("exampleName")).test(Optional.empty()).build(),
        };

        for (Example ex : examples) {
            System.out.println(mapper.writeValueAsString(ex));
        }
    }
}

Вывод:

{}
{"name":"exampleName"}
{"name":"exampleName","test":null}
0 голосов
/ 16 июня 2020

В Java ваши атрибуты будут нулевыми, если не установлены. Поэтому, если вы не добавите какой-то флаг, чтобы знать, когда атрибут был фактически установлен (даже равным нулю), вы не сможете достичь того, чего хотите. То есть нет никакой разницы между неустановленным атрибутом и атрибутом, для которого установлено значение null. Если вы добавили флаг «isSet» (вероятно, карту, так как ее флаг для каждого атрибута), вам, вероятно, понадобится специальный преобразователь Джексона, который считывает флаги «isSet» и действует соответствующим образом.

...