问题描述
我有以下课程:
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>