Как узнать, какие свойства игнорируются @JsonIgnoreProperties (ignoreUnknown = true) - PullRequest
1 голос
/ 21 января 2020

Мне нужно сериализовать - десериализовать существующий Java POJO в моем коде. POJO большой + он имеет несколько родительских классов в иерархии. Код использует Spring и поэтому Джексона внутри. Я начал исправлять одну за другой проблему, которую нашел, исправляя имя getter-setter, включая @JsonIgnore et c, и по прошествии значительного времени полностью его исправил.

Но мне нужно исправить несколько таких классов, поэтому для В следующем классе я просто добавил: @JsonIgnoreProperties(ignoreUnknown=true), который работал, но во время тестирования я обнаружил, что он игнорирует свойство, которое не должно игнорироваться. Свойство было похоже на

@JsonIgnoreProperties(ignoreUnknown=true)
class MyClass {
   private String xyz;
   public String getXyzValue() {
     return this.xyz;
   }
   public void setXyz(String xyz) {
     this.xyz = xyz;
   }
}

Так что в основном мне пришлось исправить метод получения здесь.

Вопрос: Есть ли способ использовать @JsonIgnoreProperties(ignoreUnknown=true), но перечислить вниз все игнорируемые свойства для дальнейшего анализа?

1 Ответ

1 голос
/ 21 января 2020

Удалите JsonIgnoreProperties аннотацию и зарегистрируйте свой собственный com.fasterxml.jackson.databind.deser.DeserializationProblemHandler обработчик проблемы. См. Пример ниже:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
import com.fasterxml.jackson.databind.json.JsonMapper;

import java.io.IOException;

public class JsonApp {

    public static void main(String[] args) throws IOException {
        String json = "{\"xyz\":\"X\",\"a\":1,\"yxz\":2}";
        DeserializationProblemHandler handler = new DeserializationProblemHandler() {
            @Override
            public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException {
                System.out.println("Unknown property '" + propertyName + "' for " + beanOrClass.getClass());
                return true;
            }
        };
        JsonMapper mapper = JsonMapper.builder()
                .addHandler(handler)
                .build();

        mapper.readValue(json, MyClass.class);
    }
}

Надпечатки кода выше:

Unknown property 'a' for class com.example.MyClass
Unknown property 'yxz' for class com.example.MyClass

Примечание

Класс JsonMapper представлен в версии 2.10. Ниже этой версии вы можете использовать ObjectMapper конструктор.

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