簡體   English   中英

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);
    }
}

例如,這是通過常規泛型類調用的,我使用類型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

您可以在此處閱讀有關如何執行此操作的更多信息: 如何在Gson中實現TypeAdapterFactory?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM