java - Spring JSON序列化、Gson反序列化

标签 java json spring serialization 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);
    }
}

例如,这是通过常规泛型类调用的,我将使用 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;
}

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

最佳答案

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

您可以在此处阅读有关如何执行此操作的更多信息:How do I implement TypeAdapterFactory in Gson?

关于java - Spring JSON序列化、Gson反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29985242/

相关文章:

java - 修改嵌入式tomcat的SO_TIMEOUT(读取超时)

java - 通常在大型 J2EE web 应用程序上,按模块清楚地分离应用程序。可能使用业务委托(delegate)模式

java - Spring Modules 项目发生了什么?

java - 隐藏 Jackson 序列化中的 protected 字段

java - Spring MVC 从 RequestMapping 引用 params 变量

java - 为什么String中的equals方法不使用hash?

java - 基于HBase和Hadoop MapReduce的分布式multimap

java - 为 JERSEY Web 服务编写测试用例的最佳方法是什么?

json - 在 Go 中解析 JSON

javascript - 如何在数据网格中显示由具有属性和值的对象组成的数组?