Jersey客户端:如何POST嵌套的JSON数据?

时间:2013-09-12 16:55:04

标签: java json jersey-client

我正在使用Jersey(v 1.17.1)客户端与我无法控制的远程服务器进行通信(因此我无法查看收到的请求)。

我喜欢发布带有JSON数据的POST请求,其结构与此示例类似:

{"customer":"Someone",
 "date":"2013-09-12",
 "items":[{
     "sequenceNo":1,
     "name":"foo",
     "quantity":2,
     "price":42,
     "tax":{"percent":7,"name":"vat 7%"}
   },
   {
     "sequenceNo":2,
     "name":"bar",
     "quantity":5,
     "price":23,
    "tax":{"percent":7,"name":"vat 7%"}
   }
 ]
}

这是我的代码:

final Client c = Client.create();
final WebResource service = c.resource(SERVER);

final Form form = new Form();
form.add("customer", "Someone");
form.add("date", "2013-09-12");
form.add("items", XXX); // how do I do that?

final ClientResponse response = service.path("aPath").queryParam("param", "value").cookie(new Cookie("token", token))
        .type(MediaType.APPLICATION_JSON)
        .post(ClientResponse.class, form);
    final String raw = response.getEntity(String.class);
    System.out.println("Response " + raw);

我尝试了几种方法(比如嵌套另一个Form对象),但我总是得到相同的结果:服务器返回400 - 错误请求(“客户端发送的请求在语法上不正确(错误请求)。”)我假设因为没有正确发送强制参数项。

有人知道我是如何嵌套JSON数据的吗?我认为这是一个常见的案例,但我在网上找不到任何例子。

1 个答案:

答案 0 :(得分:0)

表单本质上是一个将值限制为字符串的映射。你需要的是一个简单的Map(例如HashMap)。每个嵌套元素也都是一个地图。所以你会有类似的东西。

Map<String, Object> data = new HashMap<String, Object>();
data.put("customer", "Someone");
data.put("date", "2013-09-12");

Map<String, Object> item1 = new HashMap<String, Object>();
item1.put("sequenceNo", 2);
item1.put("name", "foo");

data.put("items", Arrays.asList(item1));

通过这种方式,您可以根据需要进行尽可能多的嵌套。

或者,您可以创建一些表示数据结构的类。泽西岛将知道如何序列化它。

class Item {
  String name;
  int sequenceNo;
  // getters & setters
}

class Data {
  String customer;
  String date;
  List<Item> items;
  // getters & setters
}