gpt4 book ai didi

java - 自动绑定(bind)复杂 (JSON) 表单数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:01 25 4
gpt4 key购买 nike

我的 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;
}

它不会自动绑定(bind)记录。然后我尝试使用 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;
}

它也不会自动绑定(bind)数据。对于这个简单的用例,我真的需要使用像 jackson 这样的低级 API 吗?任何指针?无法找到复制/粘贴示例,从 jackson 那里,我的类路径上有 org.codehaus.jacksoncom.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();

所以现在我得到了所有发布的表单数据,我的问题就这样解决了(谢谢!)。然而,它有点难看。我还想不通的是如何将所有发布数据放在一个对象中。如果有人对此作出答复,那么我将更新问题并删除这部分内容。否则我会在几天后接受单一答案。

最佳答案

在我看来,你应该使用 jackson官方文档中描述的 API here .

我假设您通过 request().body().asFormUrlEncoded().get() 获得了 JSON , 所以它返回 String[]包含您的 JSON 字符串。你可以做这样的事情(也许有点复杂并且错过了 Exception 处理):

String[] jsonData = request().body().asFormUrlEncoded().get("records")
MyForm myForm = new MyForm();
// Record should act as form, because each JSON string data contain this type
Form<Record> form = Form.form(Record.class);
// parse the JSON string and assign iterator
Iterator<JsonNode> it = Json.parse(jsonData[0]).iterator();
// assign to the MyForm instance
while (it.hasNext()) {
formData.records.add(form.bind(it.next()).get()); // bind the JSON and add
}

因此,在上面代码的末尾,((MyForm) formData).records应该包含 List<Record>来自您的 JSON 的对象。

关于java - 自动绑定(bind)复杂 (JSON) 表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16456040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com