我是GSON,JSON的新手,因此问了这个问题:
在安卓端,我必须向服务器上的 REST WS 发送预订信息。所以这里有一个问题:
我有一个BookingDTO,我使用GSON对其进行序列化。我把它发送到服务器上的 REST WS。现在,我是否还需要在服务器端使用相同的BookingDTO进行GSON反序列化?(但这意味着紧密耦合,对吧?我必须使用 GSON 还是可以使用普通 JSON?
我应该采取什么方法?
您可以使用JSON并将该内容解析到您的对象中,或者直接处理方法(服务器端)中的JsonObject
和JsonArray
。
如果你想使用像BookingDTO
这样的对象,你可以在Android项目上重新创建类,或者从服务器端重用这些类(反之亦然)。
通过创建仅包含所有 POJO 类所在的类(例如,仅导出模型包)的JAR文件。
使用 JAR 文件可以保持服务器和客户端代码之间的一致性,当您添加/删除字段时,您不必更改 2 个类,只需在一个地方更改并重新导出 JAR。
现在到紧密耦合问题,我认为这里没有。 因为您正在使用类列表(并且您需要它们在 2 个或更多单独的位置/项目中......),所以这不是耦合,这是重用相同的代码,这应该是一种很好的做法。
例如,当Class A
是Class B
的成员时,耦合是,但当您在 2 个不同的系统/组件中使用Class A
和Class B
时,就不是这样了......
我还需要在服务器端使用相同的BookingDTO用于GSON吗? 反序列化它?
简而言之,是的,您必须准备一个POJO才能接收请求。因此,为此,JSON 反序列化程序将尝试解析 JSON 请求的属性并将其映射到服务器的 POJO。
对于Spring,我们做了如下的事情。这是一个创建 POST 请求类型的控制器,期望拥有BookingDTO
类型的参数。我们使用杰克逊库进行 JSON 序列化和反序列化。
@RequestMapping(value = {"/update"}, method = RequestMethod.POST)
@ResponseBody
public void update(@RequestBody BookingDTO bookingDTO) throws FamsException {
// Do what you intend to do with this bookingDTO object sent from client side(Android)
}
就目前而言,如果您的 JSON 属性名称与属性名称和BookingDTO
类型匹配,那么它可以映射这些名称,您将获得BookingDTO bookingDTO
具有所有匹配属性的对象。
请确保不要使用不在BookingDTO
POJO 中的属性发送 JSON 请求。否则,服务器将抛出 400 错误请求错误。
请注意,您也可以将Map
作为参数发送。这不需要在服务器端匹配 POJO。您可以通过按照自己喜欢的方式将数据从 Map 中取出来构造不同的对象。
希望你明白这个想法。