【问题标题】:Binding JSON to complex Java classes with Jersey使用 Jersey 将 JSON 绑定到复杂的 Java 类
【发布时间】:2016-10-02 06:05:10
【问题描述】:

我正在使用 Jersey 开发的 RESTful API 使用并生成 JSON,并且我知道 Jersey 使用 Jackson 将 JSON 自动绑定到 Java 类存在依赖关系。我对依赖关系有点困惑,但使用 jersey-media-json-jackson 似乎包含此功能。

我读到这个自动绑定是针对 POJO 的,而我的类比简单的 POJO 复杂得多。因此,对于 POJO,绑定需要一个默认构造函数、所有 setter(如果您想解组)和所有 getter(如果您在编组之后)。但是,我的课不是这样的。它们有限制,没有默认构造函数,只有几个特定的​​构造函数,也没有我想要编组和/或解组的每个成员的 setter 和 getter。

这种情况有解决方法吗?还是我应该忘记使用数据绑定?也许自定义序列化程序可以挽救这种情况?

我只是想要这个,因为我认为拥有这个会更好:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public GroceryItem createGroceryItem(GroceryItem item) {
    // process the item... do whatever
    return item;
}

比拥有原始版本:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String createGroceryItem(String jsonData) throws JsonProcessingException {
    return new ObjectMapper().writeValueAsString(jsonData);
}

或者也许我只是以错误的方式看待这种情况。既然如此,请赐教。

【问题讨论】:

  • 非原始版本如何知道POJO?是否有一些预处理步骤可以将 JSON 转换为对象?换句话说,有一个原始版本,你只是不想维护它
  • 第一个问题:没有POJO。第二个问题:我想弄清楚我是否应该这样做或做什么。第三句话:我不确定我是否理解。
  • GroceryItem 不是 POJO?对于第三句话,你说你想要从 String Request 到 GroceryItem 请求的一些自动转换,也就是说你不想“维护”,或者自己编写 JSON 转换步骤,让 Jersey+Jackson 来做?
  • 不,它不是 POJO。实际上没有GroceryItem 类,我只是以它为例。这些类实际上是 TournamentSchedule 和类似的。
  • 并回答第二部分。好吧,如果我能避免自己写,让图书馆来做,我会更开心。但由于我不处理 POJO,看来我必须编写自己的自定义序列化器和反序列化器。但与此同时,我不想在我的服务中处理原始数据 (String)。我希望这些方法能够接收和返回Touranament 和这样的类,而不仅仅是字符串。

标签: java json rest jersey jackson


【解决方案1】:

没有默认构造函数意味着你不能轻易地使用 Jackson 来解组。 没有 getter 意味着你不能轻易地使用 Jackson 来编组。

您有多种选择:

  1. 编写您自己的 JSON 转换代码。
  2. 更改您的类以生成 POJO 类,然后用于 JSON 转换。基本上,为每个类添加两个方法:createJsonData() 和 importFromJsonData() 以使用 Jackson 编组和解组。

编辑 toPOJO 和 fromPOJO 可能是很好的方法名称。或者,toJSON 和 fromJSON 并使用内部静态 POJO 类进行 Jackson 序列化。

【讨论】:

  • 我想序列化和反序列化的类中可能有两个方法fromJsontoJson?但这并不能免除在 Web 服务中处理原始数据的麻烦。
  • 第二个问题:所以这里用Jackson基本没用?或者只是它具有的绑定功能?因为我仍然可以使用来自 Jackson 的 JsonNode、序列化程序等来编写上述方法,对吗?
  • Jackson 对于没有 getter 和 setter 的类来说并非毫无用处。然而,它是;不会是无缝的。您将必须实现自定义序列化。您需要花时间阅读 Jackson 的教程和文档。
  • 请看我上面的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多