【问题标题】:Spring JSON serialization, Gson deserializationSpring JSON 序列化、Gson 反序列化
【发布时间】:2015-07-11 04:32:22
【问题描述】:

我目前在反序列化某些内部对象时遇到问题,在春天,我在使用@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;
}

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

【问题讨论】:

    标签: java json spring serialization gson


    【解决方案1】:

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

    【讨论】:

    • 我很想改变 JSON,不幸的是,这意味着改变超过 3 个不同平台的模型,这现在不是一个真正的选择。我认为如果 Gson 中不是自动的,我会考虑让 Spring 提供完整数据(听起来很可怕)谢谢伙计!
    • @ThomasNairn 这就是我回答的第二部分所说的,如何让 Gson 自动完成
    • 嗯,只是这本身可能需要在 2 个平台上进行半天的工作,而这目前并不可行,我想如果我要花那么长时间,我不妨再次更改 json 的结构,这在我目前的时间限制下是可能的。再次感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多