我有以下课程:
public class Result<T> {
    public int code;
    public Object meta;
    public T data;
}
public class User {
    public int id;
    public String name;
}
public class Error {
    public String field;
    public String message;
}我想反序列化一个基于code字段的JSON有效负载。如果为code >= 10,则返回Result<ArrayList<Error>>,否则返回Result<User>
目前,我首先将JSON映射到Result<Object>,然后检查code字段。基于该值,我将第二个映射到所需的对象。
ObjectMapper mapper = new ObjectMapper();
Result<Object> tempResult = mapper.readValue(json, new TypeReference<Result<Object>>() {});
if (tempResult.code < 10) {    
    Result<User> result = mapper.readValue(json, new TypeReference<Result<User>>() {});
    return result;
} else {
    Result<ArrayList<Error>> result = mapper.readValue(json, new TypeReference<Result<ArrayList<Error>>>() {});
    return result;
}有没有一种优雅的方法可以不用反序列化2次就能做到这一点?
发布于 2020-09-17 18:07:43
您需要实现自定义的TypeIdResolver
class UserTypeIdResolverBase extends TypeIdResolverBase {
    @Override
    public String idFromValue(Object value) {
        throw new IllegalStateException("Not implemented!");
    }
    @Override
    public String idFromValueAndType(Object value, Class<?> suggestedType) {
        throw new IllegalStateException("Not implemented!");
    }
    @Override
    public JsonTypeInfo.Id getMechanism() {
        return JsonTypeInfo.Id.CUSTOM;
    }
    @Override
    public JavaType typeFromId(DatabindContext context, String id) {
        if (Integer.parseInt(id) < 10) {
            return context.getTypeFactory().constructType(new TypeReference<Result<User>>() {});
        }
        return context.getTypeFactory().constructType(new TypeReference<Result<List<Error>>>() {});
    }
}并为Result类声明它:
@JsonTypeInfo(property = "code", use = JsonTypeInfo.Id.CUSTOM, visible = true)
@JsonTypeIdResolver(UserTypeIdResolverBase.class)
class Result<T>https://stackoverflow.com/questions/63931645
复制相似问题