Fasterxml json от нуля до «ноля»

у меня урок

      @Data
class Person {

  @JsonProperty(value="name", defaultValue = "null")
  private String name = "null";

  @JsonProperty(value="surName", defaultValue = "null")
  private String surName= "null";

}

Когда я пытаюсь десериализовать строку типа {"name":null, "surName":null} с помощью

      new ObjectMapper().readValue(json, Person.class); 

У меня есть объект с нулевыми полями, но мне нужно с «нулевыми» полями. Как это сделать?

1 ответ

НедвижимостьdefaultValueаннотации @JsonProperty не приводит к фактической установке значения по умолчанию и используется только в информационных целях. Это может ввести в заблуждение, но именно так сейчас реализован Джексон: https://fasterxml.github.io/jackson-annotations/javadoc/2.14/com/fasterxml/jackson/annotation/JsonProperty.html#defaultValue--

Установка значения по умолчанию для полей Java, вероятно, также не будет работать, поскольку на самом деле эти свойства есть в вашем JSON, поэтому установщики будут фактически вызваны и перезапишут исходные «нулевые» значения (вы можете проверить это с помощью отладчика).

Простым решением было бы установить@JsonSetter(nulls = Nulls.SKIP):

Рабочий пример:

      @Data
public class Person {
  @JsonProperty
  @JsonSetter(nulls = Nulls.SKIP)
  private String name = "null";

  @JsonProperty
  @JsonSetter(nulls = Nulls.SKIP)
  private String surName = "null";
}



public class PersonTest {
  @Test
  public void testDeserializePerson() throws JsonProcessingException {
    var result = new ObjectMapper().readValue("{\"name\":null, \"surName\":null}", Person.class);
    assertEquals(result.getName(), "null");
    assertEquals(result.getSurName(), "null");
  }
}
Другие вопросы по тегам