【问题标题】:Deserialize a JSON payload to object base on JSON integer property基于 JSON 整数属性将 JSON 有效负载反序列化为对象
【发布时间】:2020-09-17 05:12:54
【问题描述】:

我有以下课程:

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 &gt;= 10,则返回Result&lt;ArrayList&lt;Error&gt;&gt;,否则返回Result&lt;User&gt;

目前,我首先将JSON 映射到Result&lt;Object&gt;,然后检查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 次?

【问题讨论】:

    标签: java json jackson deserialization json-deserialization


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      相关资源
      最近更新 更多