我的 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.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();
所以现在我得到了所有发布的表单数据,我的问题就这样解决了(谢谢!)。然而,它有点难看。我还想不通的是如何将所有发布数据放在一个对象中。如果有人对此作出答复,那么我将更新问题并删除这部分内容。否则我会在几天后接受单一答案。
最佳答案
在我看来,你应该使用 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/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www