gpt4 book ai didi

包含通用类型对象的java jackson解析对象

转载 作者:行者123 更新时间:2023-11-29 06:40:21 25 4
gpt4 key购买 nike

我有以下问题。

我必须将 json 请求解析为包含通用类型字段的对象。

编辑

我已经使用常规类类型进行了一些测试(所以我在用通用替换它之前让它工作)。现在解析单个元素效果很好。

问题是当我需要从那个类中解析出一个列表对象时。

所以我必须以某种方式通知 jackson ,我的 T 是列表类型,而不仅仅是 AlbumModel。

这是我尝试过的。

 @Override
public ListResponseModel<AlbumModel> parse(String responseBody) throws Exception {
JavaType type = mapper.getTypeFactory().constructParametricType(ResponseModel.class,
AlbumModel.class);
return mapper.readValue(responseBody,
mapper.getTypeFactory().constructParametricType(ResponseModel.class, type));
}

但是上面的代码不起作用。类似这样的解决方案是什么?

我在 ListResponseModel 中的泛型定义如下:List<T> data

成功如:

public class BaseResponseModel<T> {

@JsonProperty("data")
private T data;

@JsonProperty("paginations")
private PaginationModel pagination;
}

到目前为止,我有以下代码,但它总是解析为哈希。

public class ResponseParser extends BaseJacksonMapperResponseParser<ResponseModel<AlbumModel>> {

public static final String TAG = ResponseParser.class.getSimpleName();

@Override
public ResponseModel<AlbumModel> parse(String responseBody) throws Exception {
return mapper.readValue(responseBody,
mapper.getTypeFactory().constructParametricType(ResponseModel.class, AlbumModel.class));
}
}

public abstract class BaseJacksonMapperResponseParser<T> implements HttpResponseParser<T> {

public static final String TAG = BaseJacksonMapperResponseParser.class.getSimpleName();

public static ObjectMapper mapper = new ObjectMapper();

static {
mapper.disable(Feature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
}

}

最佳答案

我同意 eugen 的回答,但只是想稍微扩展一下。第一步是重构您的解析方法,使其接受第二个参数。您不需要在方法中分配类型引用,而是要求调用方传入 TypeReference 实例。

public BaseResponseModel<T> parse(String responseBody, TypeReference<T> ref) throws Exception {
return mapper.readValue(responseBody, ref);
}

不幸的是,您的代码片段没有显示调用解析的代码 - 所以我会弥补:

BaseResponseParser<Collection<Person>> parser = new BaseResponseParser<Collection<Person>>();
BaseResponseModel<Collection<Person>> result = parser.parse(jsonText, new TypeReference<Collection<Person>>(){});

请注意,在这种情况下编译 TypeReference 实例时,它是对我们期望的真实具体类的类型引用。

您可以在运行时传入一个类来做同样的事情,但是 TypeReference 更强大一些,因为它甚至在类型 T 是泛型集合时也能工作。 TypeReference 实现中有一些神奇之处,允许它保留通常会被删除的类型信息。

[更新]

更新使用 Collection<Person> .注意 - 据我所知 List<Whatever>也应该工作,但我仔细检查了一个项目,在该项目中我使用 jackson 反序列化集合。基类 Collection 确实有效,所以我坚持使用它。

关于包含通用类型对象的java jackson解析对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13088239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com