package com.example.demo.service;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
import com.fasterxml.jackson.databind.deser.ResolvableDeserializer;
import com.fasterxml.jackson.databind.type.TypeFactory;
import lombok.Getter;
import lombok.Setter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MyDeserizer {
@Getter
@Setter
@JsonDeserialize(using = CustomDeserializer.class)
public static class Parent {
private String id;
private String type;
}
@Getter
@Setter
public static class FirstChild extends Parent {
private String name;
}
@Getter
@Setter
public static class SecondChild extends Parent {
private int age;
}
private static HashMap<String, Class> type_Container = new HashMap() {{
put("first", FirstChild.class);
put("second", SecondChild.class);
}};
public static class CustomDeserializer extends JsonDeserializer {
@Override
public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
ObjectCodec codec = jsonParser.getCodec();
JsonNode node = codec.readTree(jsonParser);
String type = node.get("type").textValue();
Class clazz = type_Container.getOrDefault(type, Parent.class);
BeanDeserializerFactory deserializerFactory = BeanDeserializerFactory.instance;
TypeFactory typeFactory = TypeFactory.defaultInstance();
JavaType javaType = typeFactory.constructType(clazz);
BeanDescription beanDesc = deserializationContext.getConfig().introspect(javaType);
JsonDeserializer deserializer = deserializerFactory.createBeanDeserializer(deserializationContext, javaType, beanDesc);
if (deserializer instanceof ResolvableDeserializer) {
((ResolvableDeserializer) deserializer).resolve(deserializationContext);
}
JsonParser copyJsonParser = codec.treeAsTokens(node);
deserializationContext.getConfig().initialize(copyJsonParser);
if (copyJsonParser.currentToken() == null) {
copyJsonParser.nextToken();
}
return deserializer.deserialize(copyJsonParser, deserializationContext);
}
}
public static void main(String[] args) throws IOException {
FirstChild firstChild = new FirstChild();
firstChild.setName("123");
firstChild.setId("1");
firstChild.setType("first");
SecondChild secondChild = new SecondChild();
secondChild.setId("2");
secondChild.setAge(30);
secondChild.setType("second");
ArrayList<Parent> list = new ArrayList<>();
list.add(firstChild);
list.add(secondChild);
ObjectMapper objectMapper = new ObjectMapper();
FirstChild first = objectMapper.readValue(JSON.toJSONString(firstChild), FirstChild.class);
System.out.println(JSON.toJSONString(first));
List<Parent> parents = objectMapper.readValue(JSON.toJSONString(list), new TypeReference<List<Parent>>() {
});
System.out.println(JSON.toJSONString(parents));
}
}
===================================================================
梦想还是要有的,万一实现了呢!