Java Spring JSON序列化,Gson反序列化

Java Spring JSON序列化,Gson反序列化,java,json,spring,serialization,gson,Java,Json,Spring,Serialization,Gson,我目前在反序列化某些内部对象时遇到问题,在春季,我在使用@ResponseBody输出对象之前初始化所有对象 例如,这是一个响应: [{id:1, location:{id:1, ... extra location data}}, {id:2, location:1} ] 现在,GSON抛出了一个错误,因为它无法理解location:1引用的是前一个对象中已经反序列化的location对象。 反序列化通过以下方法完成: @Override public void handleReader(

我目前在反序列化某些内部对象时遇到问题,在春季,我在使用
@ResponseBody
输出对象之前初始化所有对象

例如,这是一个响应:

[{id:1, location:{id:1, ... extra location data}},
 {id:2, location:1}
]
现在,GSON抛出了一个错误,因为它无法理解
location:1
引用的是前一个对象中已经反序列化的location对象。 反序列化通过以下方法完成:

@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解决这个问题,或者让spring每次都输出完整的数据?理想情况下,我希望修复Gson,因为它将允许严重减少带宽,但在这一点上我不太担心

我的弹簧复位方法如下:

@Override
public List<T> list() {
    return service.findAll();
}
@覆盖
公开名单(){
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;
}
@覆盖
@交易的
公共列表findAll(){
List List=eventRepository.findByArchivedFalse();
用于(事件:列表){
初始化(事件);
}
退货清单;
}
@凌驾
公共事件初始化(事件obj){
初始化(obj.getLocation());
初始化(obj.getLocation().get…此处为内部数据);
返回obj;
}

我想这将需要一个真正的结构审查,但是,如果我能帮助的话,我希望保持结构大致相同。

如果您不愿意更改JSon,您将不得不编写一个自定义反序列化程序。然而,更改JSon正是我的建议

选项1:更改JSon 我认为正确的做法是有两条单独的信息,例如

{
  "uniqueLocations":
    [
      {"id":1, ... extra location details} ,
    ],
  "locationMap":
    [ 
      {"id":1,"location":1},
      {"id":2,"location":1}
      ... etc.
    ]
}
这更清楚;这将分离json,以便在相同的位置始终具有相同类型的数据


选项2:使Gson能够进行更复杂的反序列化 但是,如果您不愿意这样做,您可以编写一个自定义反序列化程序。最直接的方法是扩展,只使用特定的具体类,而不是参数化类型。但是,如果要使用参数化类型,则必须使用


您可以在这里阅读更多关于如何做到这一点的信息:

我很想更改JSON,不幸的是,这意味着要更改3个以上不同平台的模型,而这目前还不是一个真正的选项。我想,如果Gson内部不是自动的,我会考虑让Spring提供完整的数据(听起来很可怕),谢谢@ThomasNairn这就是我回答的第二部分所说的,如何让Gson自动完成这项工作嗯,只是它本身需要在两个平台上工作半天,而这两个平台目前还不太可行,我想如果我要花那么长时间,我还不如再次改变json的结构,由于我目前的时间限制,这是可能的。再次感谢您的投入。