使用Jersey 2.2使用HashMap将JSON反序列化为对象

时间:2013-09-16 19:28:44

标签: json jersey jackson jax-rs

我关注了POJO:

public class Reservation {
    private String name;
    private BigDecimal price;
    private ArrayList<HashMap<String, Object>> products;
    ...getters & setters for all fields....
}

和这个简单的Java Jersey REST资源:

@POST
@Consumes({MediaType.APPLICATION_JSON})
public String insert(Reservation re) {
    //do something here with ReservationEntity   
}

当我使用以下数据执行POST请求时:

{
  "name":"michal",
  "price":1234.3,
  "products":[
    {"id":1, "desc":"qwerty"},
    {"id":2, "desc":"ytrewq"}
  ]
}

我希望从JSON数据中获取具有产品列表的类的对象。 我得到的是一个只有名称和价格设定的对象。 ArrayList产品是空的。

我尝试使用org.codehaus.jackson.map.ObjectMapper反序列化JSON数据,如下所示:

String data = "{\"name\":\"micha\".....}";
ObjectMapper om = new ObjectMapper();
Reservation re = om.readValue(data, Reservation.class);

在此之后,对象在ArrayList产品中有两个条目(HashMaps),如预期的那样。我不喜欢以这种方式使用对象映射器所以我问,如何只使用Jersey。我已经阅读了很多关于这个问题的文章,他们中的大多数建议像这样放入web.xml:

<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>org.foobar.rest.services;org.codehaus.jackson.jaxrs</param-value>    
</init-param>

这对我也没有用。我的web.xml中甚至没有任何声明

我正在使用: - Glassfish 4.0 - 泽西岛2.2

修改 我在GitHub上创建了一个非常简单的项目库: Jersey22 MyResource类中有两个带有路径的POST方法:/ working和/ notworking

我很欣赏任何有效的例子。谢谢。

3 个答案:

答案 0 :(得分:0)

我已经在我的旧应用程序中尝试了您的代码,我没有遇到任何问题:整个对象正在被反序列化而没有任何问题:

@POST
@Consumes( { MediaType.APPLICATION_JSON } )
public void getServices(Reservation reservation) {
    System.out.println(reservation.getName());
    System.out.println(reservation.getPrice());
    ArrayList<HashMap<String, Object>> products = reservation.getProducts();
    for(HashMap<String, Object> product : products) {
        System.out.println("Product:");
        for(Entry<String, Object> e : product.entrySet()) {
        System.out.println(e.getKey() + " - " + e.getValue().toString());               
        }
    }
}

结果:

michal
1234.3
Product:
id - 1
desc - qwerty
Product:
id - 2
desc - ytrewq

所以我无法理解出了什么问题。在我的应用程序中,我使用了泽西岛1.10和杰克逊1.8.3,但我想这对泽西和杰克逊的每个版本都没问题。

如果我可以建议你改进,也可以解决你的问题,我会创建一个新的对象来定义“产品”;从概念上讲,它代表了一个对象也许更简单的List<Product>将被反序列化而没有任何问题。

答案 1 :(得分:0)

确实它应该有用......

您也可以尝试使用Genson库,将其添加到类路径中,它应该可以在没有任何其他配置的情况下运行。

答案 2 :(得分:0)

最后我有这个工作。我认为重要的步骤是:

  • 添加jersey-media-json-jackson maven依赖
  • 通过调用:register(JacksonFeature.class);
  • 来创建JAX-RS应用程序时注册Jackson