Я пытаюсь создать универсальный сериализатор c Jackon polymorphi c, который может сериализовать и десериализовать в JSON и обратно с этим форматом, включая fqcn класса объекта:
{
"fqcn": "full qualified class name of the object",
"data": "serialized object"
}
Эта оболочка должна применяться к любому объекту, например, это будет JSON представление объекта HashMap>:
{
"fqcn": "java.util.HashMap",
"data": {
"key1": {
"fqcn": "java.util.ArrayList",
"data": [
{
"fqcn": "java.lang.String",
"data": "value1"
},
{
"fqcn": "java.lang.String",
"data": "value2"
}
]
},
"key2": {
...
}
}
}
Я мог бы использовать аннотацию MixIn для всех объектов с @JsonTypeInfo
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_OBJECT)
public interface ObjMixin {
}
---
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Object.class, ObjMixin.class);
Однако формат не соответствует требуемому формату: {"fqcn": ..., "data": ...}
Я также попытался зарегистрировать StdConverter для преобразования любых объектов в оболочку, подобную этой :
public class ObjectWrapper {
private String fqcn;
private Object data;
public ObjectWrapper(Object obj) {
this.fqcn = obj.getClass.getCanonicalName();
this.data = obj;
}
}
Однако невозможно создать StdDelegatingSerializer
для Object.class
.
С пользовательским StdSerializer
, как показано ниже, я получаю StackOverflowError
:
@Override
public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider serializerProvider) throws IOException {
jsonGen.writeStartObject();
jsonGen.writeStringField("fqcn", obj.getClass().getCanonicalName());
jsonGen.writeFieldName("data");
if (obj instanceof Iterable) {
jsonGen.writeStartArray();
// Recursive serialization of all elements in the iterable
jsonGen.writeEndArray();
} else if (obj instanceof Map) {
jsonGen.writeStartObject();
// Recursive serialization of all elements in the map
jsonGen.writeEndObject();
} else {
// Infinite recursion here because I'm defining this serializer for Object.class
serializerProvider.defaultSerializeValue(obj, jsonGen);
}
}
Кто-нибудь знает какое-либо другое решение, чтобы достичь этого?