Java, Джексон Сериализация / Десериализация Дженерик - PullRequest
0 голосов
/ 22 октября 2019

с Джексоном 2.6.7. Я пытаюсь сериализовать / десериализовать Foo.

public class Foo {
    @JsonProperty("bar")
    private ValueObject<String> bar;
    @JsonProperty("baz")
    private ValueObject<Integer> baz;

    // potentially we be stretching to have something like
    // private ValueObject<OtherClass> otherObject;
    // but now just the above

    // getters, setters
}

public class ValueObject<T> {
    private static ObjectMapper MAPPER = new ObjectMapper();

    Class<T> containedClass;
    JsonNode value; // This is a requirement to store it as JsonNode
    String otherContext; // This is not in the original json, but something populated after the serialize/deserialization.
    String anotherContext; // This is not in the original json, but something populated after the serialize/deserialization.

    public ValueObject(Class<T> containedClass) {
        this.containedClass = containedClass;
    }


    public T get() {
        return MAPPER.convertValue(this.value, containedClass);
    }

    public void set(T value) {
        if (value.getClass() != containedClass) {
            throw new RuntimeException("cannot set value");
        }
        this.value = MAPPER.valueToTree(value);
    }

    // getters, setters
}

Образец json

{
  "bar": "BAR",
  "baz": 1
}

Ожидаемый эквивалентный объект

Foo expect = new Foo();
ValueObject<String> bar = new ValueObject(String.class);
bar.set("bar");
ValueObject<Integer> baz = new ValueObejct(Integer.class);
baz.set(1);
expected.setBar(bar);
expected.setBaz(baz);

В настоящее время я думаю только ореализация CustomSerializer для каждого типа ValueObject, например ValueObjectStringSerializer, ValueObjectIntegerSerializer. Есть ли другой подход к этому?

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