[英]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);
}
}
例如,這是通過常規泛型類調用的,我使用類型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正是我建議的。
我認為正確的做法是有兩個單獨的消息,例如
{
"uniqueLocations":
[
{"id":1, ... extra location details} ,
],
"locationMap":
[
{"id":1,"location":1},
{"id":2,"location":1}
... etc.
]
}
這更清楚; 這會將您的json分開,以便您在相同位置始終擁有相同類型的數據。
但是,如果您不願意這樣做,您可以編寫自定義反序列化程序。 最直接的方法是擴展TypeAdapter
,它只使用特定的具體類, 而不是參數化類型 。 但是,如果要使用參數化類型,則必須使用TypeAdapterFactory
。
您可以在此處閱讀有關如何執行此操作的更多信息: 如何在Gson中實現TypeAdapterFactory?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.