Spring JSON序列化,Gson反序列化

托马斯·奈恩

我目前在某些内部对象的反序列化方面遇到问题,在春季,我先初始化所有对象,然后再使用输出@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修复此问题,或者让spring每次输出完整的数据?理想情况下,我想使用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;
}

我想这将需要进行真实的结构审查,但是,如果我可以帮助的话,我希望结构保持大致相同。

durron597

如果您不愿意更改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?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章