将基于JSON整数属性的JSON有效负载反序列化为对象

问题描述

我有以下课程:

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;
}

我想基于JSON字段反序列化code负载。如果为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次?

解决方法

您需要实现自定义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>