如何让 Jackson 类型 id 解析器处理通用对象的集合?

时间:2021-06-30 23:22:44

标签: json jackson

我有一个定义如下的类。输入字段是一组对象,可以是数字或字符串。我想确保如果一个对象是一个数字,它总是被转换为一个 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();

0 个答案:

没有答案