我有一个定义如下的类。输入字段是一组对象,可以是数字或字符串。我想确保如果一个对象是一个数字,它总是被转换为一个 Long 对象(不是 Integer,即使一个 Integer 对象足够大)。所以我尝试使用自定义类型 id 解析器,但它不适用于集合。我做了一些实验,发现如果一个字段是单独的对象,那么它是有效的。
我的问题是如何让 Jackson 类型 id 解析器处理一组通用对象?
public class Expression <T extends Comparable<T>> extends BooleanExpressionInput<Set<T>> {
@JsonProperty("input")
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "@class")
@JsonTypeIdResolver(CustomTypeIdResolver.class)
private Set<T> input;
}
上面使用的 CustomTypeIdResolver 类定义为:
public class QueryIndexTypeIdResolver extends TypeIdResolverBase
{
@Override
public String idFromValue(Object o)
{
return o.getClass().getSimpleName();
}
@Override
public String idFromValueAndType(Object o, Class<?> aClass)
{
return o.getClass().getSimpleName();
}
@Override
public JsonTypeInfo.Id getMechanism()
{
return JsonTypeInfo.Id.NAME;
}
@Override
public JavaType typeFromId(DatabindContext context, String id) throws IOException
{
if (JSON_VALUE_TYPE_RESOLVER_MAP.containsKey(id)) {
Class resolvedClass = JSON_VALUE_TYPE_RESOLVER_MAP.get(id);
return TypeFactory.defaultInstance().constructSpecializedType(TypeFactory.unknownType(), resolvedClass);
}
return super.typeFromId(context, id);
}
}
上面使用的解析器映射定义为:
public static final ImmutableMap<String, Class> JSON_VALUE_TYPE_RESOLVER_MAP = new ImmutableMap.Builder<String, Class>()
.put("Integer", Long.class)
.put("Long", Long.class)
.put("String", String.class)
.build();