我的 JSON 数据进来了request().body().asFormUrlEncoded().get("records")
[{"string":"foo","termId":"793340"},{"string":"bar","termId":"460288"}]
我的表单定义:
public static class MyForm {
@Constraints.Required
public List<Map<String,String>> records;
public String someField;
}
它不会records
自动绑定。然后我尝试使用 POJO:
public static class Record {
public String string;
public String termId;
public void setString(String string) {
this.string = string;
}
public void setTermId(String termId) {
this.termId = termId;
}
}
并改编了表格:
public static class MyForm {
@Constraints.Required
public List<Record> records;
public String someField;
}
它也不会自动绑定数据。对于这个简单的用例,我真的需要使用像杰克逊这样的低级 API 吗?任何指针?找不到复制/粘贴示例,并且从杰克逊那里找到了,org.codehaus.jackson
并且com.fasterxml.jackson
在我的类路径中。
更新 2013-05-10:添加了一个辅助字段someField
以澄清这records
只是一个字段,而不是整个数据结构。下面的答案(我在这个编辑屏幕上看不到答案,所以没关系,只有一个)有效,但仅限于记录。这是一个例子:
private List<Record> recordsFromRequest() {
String[] jsonData = request().body().asFormUrlEncoded().get("records");
Form<Record> recordDummyForm = Form.form(Record.class);
Iterator<JsonNode> it = Json.parse(jsonData[0]).iterator();
List<Record> records = new ArrayList<>();
while (it.hasNext()) {
records.add(recordDummyForm.bind(it.next()).get());
}
return records;
}
对于我做的其他表单字段,像往常一样:
Form<MyForm> form = play.data.Form.form(MyForm.class).bindFromRequest();
所以现在我得到了所有发布的表单数据,我的问题就这样解决了(谢谢!)。但是,它有点难看。我还想不通的是如何将所有发布数据放在一个对象中。如果有人回复此问题,我将更新问题并删除此部分。否则我会在几天内接受单一答案。