首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于JSON整数属性将JSON有效负载反序列化为对象

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

Stack Overflow用户
提问于 2020-09-17 13:12:55
回答 1查看 86关注 0票数 1

我有以下课程:

代码语言:javascript
运行
复制
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字段。基于该值,我将第二个映射到所需的对象。

代码语言:javascript
运行
复制
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次就能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-09-17 18:07:43

您需要实现自定义的TypeIdResolver

代码语言:javascript
运行
复制
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类声明它:

代码语言:javascript
运行
复制
@JsonTypeInfo(property = "code", use = JsonTypeInfo.Id.CUSTOM, visible = true)
@JsonTypeIdResolver(UserTypeIdResolverBase.class)
class Result<T>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63931645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档