Spring JSON序列化,Gson反序列化
Spring JSON serialization, Gson deserialization
我目前遇到某些内部对象的反序列化问题,在 spring 中,我在使用 @ResponseBody
.
输出它们之前初始化所有对象
例如,这是一个响应:
[{id:1, location:{id:1, ... extra location data}},
{id:2, location:1}
]
现在,GSON 抛出一个错误,因为它无法理解 location: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);
}
}
例如,这是通过常规泛型 class 调用的,我将使用类型 Event[]
作为 T 泛型,以便return 一个数组。
如何使用 Gson 解决此问题或使 spring 每次都输出完整数据?理想情况下,我想使用 Gson 进行修复,因为它会严重减少带宽,但我现在并不太在意。
我的Springreturn调用方法如下:
@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
, only uses specific, concrete classes, not parameterized types. However, if you want to use a parameterized type, you must use a TypeAdapterFactory
.
您可以在此处阅读有关如何执行此操作的更多信息:How do I implement TypeAdapterFactory in Gson?
我目前遇到某些内部对象的反序列化问题,在 spring 中,我在使用 @ResponseBody
.
例如,这是一个响应:
[{id:1, location:{id:1, ... extra location data}},
{id:2, location:1}
]
现在,GSON 抛出一个错误,因为它无法理解 location: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);
}
}
例如,这是通过常规泛型 class 调用的,我将使用类型 Event[]
作为 T 泛型,以便return 一个数组。
如何使用 Gson 解决此问题或使 spring 每次都输出完整数据?理想情况下,我想使用 Gson 进行修复,因为它会严重减少带宽,但我现在并不太在意。
我的Springreturn调用方法如下:
@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
, only uses specific, concrete classes, not parameterized types. However, if you want to use a parameterized type, you must use a TypeAdapterFactory
.
您可以在此处阅读有关如何执行此操作的更多信息:How do I implement TypeAdapterFactory in Gson?