我正在使用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数据的吗?我认为这是一个常见的案例,但我在网上找不到任何例子。
答案 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
}