Изменить поле свойства json jackson в стороннем классе

У меня есть класс в сторонней библиотеке, который помечен как окончательный, и я пытаюсь десериализовать json в него с помощью Джексона, но я получаю

 org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field 

Поскольку это сторонний и окончательный вариант, я не могу добавить @JsonProperty для определения нового имени.

Как я могу переназначить данное имя свойства для использования другого?

ОБНОВЛЕНИЕ: лучше использовать миксины, я делал это неправильно.

Я пытаюсь использовать MixIns.

Вот что я делаю:

package com.some.stuff;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;

import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;


final class Closed implements Serializable {
    private List<Other> others;
    public List<Other> getOthersList() {
        return others;
    }
    public void setOthersList( List<Other> others ) {
        this.others = others;
    }
}
final class Other implements Serializable {
    private String data;
    public void setData(String data) {
        this.data = data;
    }
    public String getData() {
        return this.data;
    }
}

abstract class OthersMixIn {
    OthersMixIn(@JsonProperty("others") List<Other> othersList){}
}
class Main {

    public static void main( String ... args ) {

        String json = "{\"others\":[{\"data\":\"d\"}]}";


        ObjectMapper mapper = new ObjectMapper();
        mapper.getSerializationConfig().addMixInAnnotations(Closed.class, OthersMixIn.class);
        mapper.getDeserializationConfig().addMixInAnnotations(Closed.class, OthersMixIn.class);

        try {
            Closed closed = mapper.readValue( json , Closed.class);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

выход:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "others" (Class com.some.stuff.Closed), not marked as ignorable
 at [Source: java.io.StringReader@28d47c65; line: 1, column: 12] (through reference chain: com.some.stuff.Closed["others"])
    at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
    at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
    at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
    at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
    at org.codehaus.jackson.map.deser.BeanDeserializer._handleUnknown(BeanDeserializer.java:725)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:703)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)
    at com.some.stuff.Main.main(Main.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

person OscarRyz    schedule 11.09.2015    source источник
comment
@SotiriosDelimanolis Обновлено, заранее спасибо   -  person OscarRyz    schedule 11.09.2015


Ответы (1)


Идея примеси состоит в том, чтобы предоставить тип (с соответствующими аннотациями), который отражал бы то, что вы хотели сделать.

Делает

abstract class OthersMixIn {
    OthersMixIn(@JsonProperty("others") List<Other> othersList){}
}

означает, что вы хотите, чтобы Джексон использовал конструктор в классе Closed, который имеет параметр типа List<Other>, и использовал свойство others из JSON для его заполнения. Но это не то, что вы хотите сделать, поскольку Closed не имеет такого конструктора .

Вместо этого вы хотите имитировать добавление аннотации @JsonProperty к геттеру в классе Closed. Вот так

abstract class OthersMixIn {
    @JsonProperty("others")
    abstract List<Other> getOthersList();
}
person Sotirios Delimanolis    schedule 11.09.2015
comment
Сначала я нашел это с интерфейсом и не работал, я думал, что абстрактные классы работают с использованием конструктора. Это сработало отлично, спасибо! - person OscarRyz; 11.09.2015