java – 尝试将自定义通用gson反序列化器迁移到jackson
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 尝试将自定义通用gson反序列化器迁移到jackson,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2509字,纯文字阅读大概需要4分钟。
内容图文
目前正在使用GSON进行反序列化并使用改造GsonConverterFactory进行改造:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(new TypeToken<Map<Book, Collection<Author>>>(){}.getType(), new BooksDeserializer(context));
Gson gson = gsonBuilder.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
BookService service = retrofit.create(BookService.class);
Response<Map<Book, Collection<Author>>> response = service.getBooks().execute();
我想使用改造提供的JacksonConverterFactory?我需要提供杰克逊映射器.有没有办法像我使用GSON一样向该映射器提供类型信息?
SimpleModule simpleModule = new SimpleModule();
// TODO provide mapper with info needed to deserialize
// Map<Book, Collection<Author>>
mapper.registerModule(simpleModule);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(JacksonConverterFactory.create(mapper))
.build();
BookService service = retrofit.create(BookService.class);
Response<Map<Book, Collection<Author>>> response = service.getBooks().execute();
具体看TODO,我可以告诉映射器使用这个解串器吗?
public class BooksDeserializer extends JsonDeserializer<Map<Book, Collection<Author>>> {
@Override
public Map<Book, Collection<Author>> deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
// deserialize here
}
}
解决方法:
根据API,SimpleModule.addDeserializer(java.lang.Class, com.fasterxml.jackson.databind.JsonSerializer) requires an instance of JsonSerializer<T> whereby T is a supertype of the class you supply as an argument,即反序列化器需要能够反序列化作为所提供类的子类的对象; TypeReference< Map< Book,Collection< Author>>>不是Map< Book,Collection< Author>>的子类型.
但是,由于Java的类型擦除,为地图编写序列化器并不容易.一种方法是为地图编写一个包装类,例如
@XmlRootElement
public class SerializableBookMapWrapper {
private Map<Book, Collection<Author>> wrapped;
public SerializableBookMapWrapper(final Map<Book, Collection<Author>> wrapped) {
this.wrapped = wrapped;
}
public Map<Book, Collection<Author>> getWrapped() {
return wrapped;
}
public void setWrapped(final Map<Book, Collection<Author>> wrapped) {
this.wrapped = wrapped;
}
}
使用这种包装类,您可以实现JsonDeserializer< SerializableBookMapWrapper>并使用它.但是,如果您没有在Book and Author的定义中使用Jackson annotations,则还需要提供custom deserializers for them.
或者,您也可以尝试supplying this type information while actually using the ObjectMapper instance for deserialization.
内容总结
以上是互联网集市为您收集整理的java – 尝试将自定义通用gson反序列化器迁移到jackson全部内容,希望文章能够帮你解决java – 尝试将自定义通用gson反序列化器迁移到jackson所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。