Как игнорировать NullNode для десериализации JSON в JAVA - PullRequest
0 голосов
/ 27 марта 2019

Итак, проблема в следующем: у меня есть POJO вроде:

@Data
@Accessors(chain = true)
@JsonInclude(Include.NON_NULL)
public class TestPOJO {

  private Long id;
  private String name;
  private JsonNode jsonNode;

Также у меня есть json как

{
   "id":1
   "name": "foo"
   "jsonNode":null
}

Когда я пытаюсь десериализовать последний с помощью

ObjectMapper objectMapper = new ObjectMapper();
TestPOJO testPojo = objectMapper.readValue(<json String>, TestPOJO.class);

Я получаю testPojo объект, где jsonNode поле равно NullNode, но мне нужно testPojo == null Как я могу это исправить?

1 Ответ

0 голосов
/ 27 марта 2019

Добавить класс, который расширяет JsonDeserializer<JsonNode> и возвращает ноль, если parser.getText() равно нулю:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;

public class JsonNodeDeserializer extends JsonDeserializer<JsonNode> {

    @Override
    public JsonNode deserialize(JsonParser parser, DeserializationContext context)
            throws IOException {
        String value = parser.getText();
        if(value == null) {
            return null;
        }
        return (JsonNode) context.findRootValueDeserializer(context.constructType(JsonNode.class)).deserialize(parser, context);
    }
}

Затем аннотируйте атрибут jsonNode с помощью @JsonDeserialize(using = JsonNodeDeserializer.class), чтобы указать Джексону использовать ваш десериализатор:

@Data
@Accessors(chain = true)
@JsonInclude(Include.NON_NULL)
public class TestPOJO {

  private Long id;
  private String name;
  @JsonDeserialize(using = JsonNodeDeserializer.class)
  private JsonNode jsonNode;

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