我有以下课程:
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
复制相似问题