Jackson 和泛型类型参考
当尝试使用 Jackson 的 JSON 库和泛型方法时,开发人员可能会遇到嵌套自定义对象的问题作为 LinkedHashMap 而不是其实际类返回。这个问题的出现是由于 Java 的类型擦除,它在编译期间删除了类型信息。
在提供的代码中,测试器方法旨在将 JSON 请求解析为具有泛型类型 T 的 MyRequest 对象。但是,没有指定T 的实际类,Jackson 默认将其视为 T 扩展 Object 并将 JSON 对象绑定到映射。
要解决此问题,测试器方法在反序列化 JSON 请求时应该能够访问实际类。这可以通过将其指定为 Class 参数来实现。以下代码演示了如何执行此操作:
<code class="java">public MyRequest<T> tester(Class<T> clazz) { TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>() {}; MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef); return requestWrapper.getRequest(); }</code>
此外,为了确保在反序列化期间使用实际的类,请使用 TypeFactory 构造 JavaType,如下所示:
<code class="java">JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, clazz);</code>
与在此修改中,Jackson 会将 JSON 请求反序列化为包含指定类实例的 List,从而允许 getMyObject() 方法返回具有适当类型的对象。
以上是如何使用类型擦除反序列化 Jackson 中的嵌套通用对象?的详细内容。更多信息请关注PHP中文网其他相关文章!