java – Spring JSON序列化,Gson反序列化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring JSON序列化,Gson反序列化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1852字,纯文字阅读大概需要3分钟。
内容图文
![java – Spring JSON序列化,Gson反序列化](/upload/InfoBanner/zyjiaocheng/779/9c83f6c344724ed0982ebb1b76ec9d9e.jpg)
我目前遇到了某些内部对象反序列化的问题,在Spring中,我在使用@ResponseBody输出它们之前初始化所有对象.
举个例子,这是一个回应:
[{id:1, location:{id:1, ... extra location data}},
{id:2, location:1}
]
现在,GSON抛出一个错误,因为它无法理解该位置:1指的是在前一个对象中已经反序列化的位置对象.
反序列化按以下方法完成:
@Override
public void handleReader(Reader reader) {
try {
String json = readerToString(reader);
T object = getGson().fromJson(json, returnType);
handleObject(object);
} catch (Exception e) {
Sentry.captureException(e);
}
}
例如,这是通过常规泛型类调用的,我使用类型Event []作为T泛型以返回数组.
我怎样才能使用Gson修复此问题或每次弹出输出完整数据?理想情况下,我想修复Gson,因为这样可以大幅降低带宽,但此时我并不太感兴趣.
我的Spring返回方法如下:
@Override
public List<T> list() {
return service.findAll();
}
初始化如下:
@Override
@Transactional
public List<Event> findAll() {
List<Event> list = eventRepository.findByArchivedFalse();
for (Event event : list) {
this.initialize(event);
}
return list;
}
@Override
public Event initialize(Event obj) {
Hibernate.initialize(obj.getLocation());
Hibernate.initialize(obj.getLocation().get... inner data here);
return obj;
}
我想这需要一个真正的结构审查,但是,如果我能帮助它,我想保持结构大致相同.
解决方法:
如果你不愿意改变JSon,你将不得不编写自定义反序列化器.但是,更改JSon正是我建议的.
选项1:更改JSon
我认为正确的做法是有两个单独的消息,例如
{
"uniqueLocations":
[
{"id":1, ... extra location details} ,
],
"locationMap":
[
{"id":1,"location":1},
{"id":2,"location":1}
... etc.
]
}
这更清楚;这会将您的json分开,以便您在相同位置始终拥有相同类型的数据.
选项2:让Gson能够进行更复杂的反序列化
但是,如果您不愿意这样做,您可以编写自定义反序列化程序.最直接的方法是扩展TypeAdapter,只使用特定的具体类,而不是参数化类型.但是,如果要使用参数化类型,则必须使用TypeAdapterFactory.
您可以在此处详细了解如何执行此操作:How do I implement TypeAdapterFactory in Gson?
内容总结
以上是互联网集市为您收集整理的java – Spring JSON序列化,Gson反序列化全部内容,希望文章能够帮你解决java – Spring JSON序列化,Gson反序列化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。