с Джексоном 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. Есть ли другой подход к этому?