(Джексон 1.9.2) Как заставить @JsonIgnore работать: десериализация с аннотациями mixin и полиморфными типами - PullRequest
1 голос
/ 08 декабря 2011

Я пытаюсь десериализовать строку типа JSON (извлечен этот бит, чтобы показать проблему)

{
    "$type": "com.example.StringProperty",
    "value": "hello world",
    "name": "text",
    "readOnly": false
}

в иерархию классов, которые выглядят как

public class Property
{
    public String name;
    public int    type;

    Property(String pName, int pType) { name = pName; type = pType; }
}

public class StringProperty extends Property 
{
    public String value;        
    StringProperty(String pName, String pValue) {
        super(pName, String);
        value = pValue;
    }       
}

с использованием следующих смешанных аннотаций

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="$type")
abstract public class PropertyMixin
{
    @JsonProperty
    public String name;
    //@JsonIgnore
    //public boolean readOnly;
    @JsonProperty
    public int type;

    PropertyMixin(@JsonProperty("name") String pName, @JsonProperty("type") int pType)
    {
    }
}

abstract public class StringPropertyMixin
{
    @JsonProperty
    public String value;
    //@JsonIgnore
    //public boolean readOnly;

    @JsonCreator
    public StringPropertyMixin(@JsonProperty("name") String pName, @JsonProperty("value") String value)
    {
    }
}

С Джексоном 1.9.2 я получаю ошибку

Unrecognized field "readOnly" (Class com.example.StringProperty), not marked as ignorable

Я пытался использовать @JsonIgnore, но это не помогло (проверьте расположение кода, который я закомментировал, чтобы увидеть, как я его пробовал). Я, вероятно, что-то упускаю, но я думаю, что другой взгляд должен взглянуть на это и помочь мне.

Вот как выглядит среда десериализации:

        objectMapper.setVisibilityChecker(objectMapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.NONE)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

        MixinRegistrations module = new MixinRegistrations();
        objectMapper.registerModule(module);

и модуль mixin выглядит как

@Override
public void setupModule(SetupContext context)
{
    context.setMixInAnnotations(Property.class, PropertyMixin.class);
    context.setMixInAnnotations(StringProperty.class, StringPropertyMixin.class);
}

Я ценю всю помощь. Заранее спасибо.

PS: я не знаю, имеет ли это значение, но JSON генерируется библиотекой, написанной в .Net Framework v4.

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

Обратите внимание, что ваша проблема не в том, что класс имеет свойство, которое Джексон не распознает, а в том, что JSON имеет свойство.Таким образом, вы можете прочитать эту вики-страницу .

Как уже упоминалось, @JsonIgnoreProperties будет работать здесь, поскольку добавление этой аннотации к классу не требует поля или установщика, в отличие от @JsonIgnore делает.Кроме того, его можно использовать для игнорирования любых неизвестных свойств.

3 голосов
/ 08 декабря 2011

Я считаю, что у Джексона проблемы, потому что метод, который вы делегировали как создатель, не имеет параметра для поля readOnly.Поэтому вместо того, чтобы молча игнорировать этот пропущенный параметр, Джексон выдает ошибку (хорошее поведение).Попробуйте использовать аннотацию JsonIgnoreProperties.У меня не было необходимости использовать, если раньше, но для десериализации вы можете явно обозначить поля, которые не требуются создателю.

Редактировать: Еще один вопрос, который был найден спрашивающим, был полезным.

0 голосов
/ 25 мая 2015
@JsonIgnoreProperties({"propX", "propY"})

Отлично подойдет на уровне класса!

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