【问题标题】:Deserlize Set in jackson via Rest通过Rest反序列化杰克逊中的集合
【发布时间】:2014-02-05 12:11:46
【问题描述】:

第一次来这里,但长期阅读...一直在旋转我的轮子,并且很难找到一种方法来完成某些事情,使用 Jackson 和 Wink 对一组发送过来的对象进行去耳化。由于某种原因,其中的 HashSet 无法正确转换。这是一个示例:我有一个对象 Foo,它是 DAO 中的一个实体。我可以对包含 Sets 和 List 等的单个 Foo 对象进行序列化和反序列化,没问题。这是我的 Foo 对象:

[{"uuid":"1","version":1,"salutation":null,"firstName":"Random1","lastName":"Dude1"},
{"uuid":"2","version":1,"salutation":null,"firstName":"Random2","lastName":"Dude2"}]

我一直在尝试在使用 Wink 和 Jackson 的 Rest 服务中执行此操作。示例如下:

@Resource
BarManager barManager

@PUT
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Bar addFoosForBar(@PathParam("id") String id, Set<Foo> foos) {
Bar bar = barManager.getById(id);
bar.addFoos(foos);
return barManager.update(bar);
}

这是示例代码,barManager.getById(id) 是检索 Bar 对象的查找资源(@Resource 注释)。 “addFoos”方法将一组 Foo 添加到 Bar,或者在这种情况下将 foos 添加到查找的 bar。在这段代码中,其余服务中的 foos 回来了,我可以检查 foos,它看起来与 json 对象完全一样,但我得到一个异常“java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.model.Foo ” 当我尝试将 foos 作为一个集合使用时,即尝试迭代等。 我的问题是杰克逊可以反序列化一组作为实体的对象,还是你必须定义一个单独的对象类型,它是一组实体,只是专门作为杰克逊使用的地图?综上所述,Jackson 是如何考虑已定义对象的 HashSet 进行反序列化的?无法在一个方向上点燃导火索,因为它应该是直截了当的,我只想反序列化该集合并能够在其余服务中将其作为 POJO 进行操作。

【问题讨论】:

  • 你期待什么?应该如何调用您的示例函数?指定输入格式,例如给出示例 JSON 请求。
  • 对此休息服务添加了一些说明,但只是希望用一组 foo 更新栏来回答您的第一个问题。在这种情况下,@Path("{id]") 通过 URL 调用它是一个休息服务。输入格式在客户端发送的有效负载中。如果我在 JVM 中检查 foos,它看起来与上面的 JSON 对象完全一样。

标签: java json rest jackson


【解决方案1】:

这是我为能够反序列化 Jackson 中的已知实体集所做的工作。使用 ObjectMapper 并在每个休息服务上定义如下示例:

@Resource
BarManager barManager

ObjectMapper mapper = new ObjectMapper();

@PUT
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Bar addFoosForBar(@PathParam("id") String id, String foos) {

HashSet<foos> foosSet = null;
JavaType javaType = mapper.getTypeFactory().constructParametricType(HashSet.class, Foo.class);
try {
     fooSet = mapper.readValue(foos, javaType);
} catch (IOException e) {
e.printStackTrace();
}

Bar bar = barManager.getById(id);
bar.addFoos(foos);
return barManager.update(bar);
}

这不是最伟大的工作,但会在使用 Jackson 的构造函数的已知定义类上制作集合、列表和任何东西。希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多