import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.DatabindContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver;
import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase;
import lombok.Data;
import java.io.IOException;
public class PartnerTypeIdResolver extends TypeIdResolverBase {
private JavaType superType;
@Override
public void init(JavaType baseType) {
superType = baseType;
}
@Override
public String idFromValue(Object value) {
return null;
}
@Override
public String idFromValueAndType(Object value, Class<?> suggestedType) {
return null;
}
@Override
public JsonTypeInfo.Id getMechanism() {
return null;
}
@Override
public JavaType typeFromId(DatabindContext context, String id) throws IOException {
char c = id.charAt(0);
Class<?> subType = null;
switch (c) {
case '1':
subType = Person.class;
break;
case '2':
subType = Community.class;
break;
case '3':
subType = Organization.class;
break;
default:
throw new RuntimeException("Invalid Partner type");
}
return context.constructSpecializedType(superType, subType);
}
}
class Main {
public static void main(String[] args) throws IOException {
String json = "{\"id\":\"1\", \"name\":\"asd\", \"partnerType\":\"220\", \"communityClass\":\"1\"}";
ObjectMapper mapper = new ObjectMapper();
Partner partner = mapper.readValue(json, Partner.class);
System.out.println(partner);
}
}
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM, include = JsonTypeInfo.As.PROPERTY, property = "partnerType")
@JsonTypeIdResolver(PartnerTypeIdResolver.class)
class Partner {
private Long id;
private String name;
private Integer partnerType;
}
@Data
class Person extends Partner{
private Integer personClass;
}
@Data
class Community extends Partner{
private Integer communityClass;
}
@Data
class Organization extends Partner{
private Integer organisationClass;
}