我正在使用Java的Play框架(2.4)。我想将JSONObject传递给其中一个Play视图模板中使用的javascript 在Java方面,我准备了JSONObject,如下所示:
(请记住,这是一种测试工具。)
public static Result showBusinesses(){
List<Item> list = new ArrayList<Item>();
Item r = new Item();
r.id = "23234";
r.name = "Joes hardware";
Item s = new Item();
s.id = "23254";
s.name = "Martys collision";
list.add(r);
list.add(s);
return ok(views.html.wheel.render(getJSONObject(list)));
}
public static JSONObject getJSONObject(List<Item> list){
JSONObject jsonObject = new JSONObject();
try{
for (int i = 0; i < list.size(); i++) {
jsonObject.put(list.get(i).id, list.get(i).name);
}
}catch (JSONException e) {
}
return jsonObject;
}
在我的Play模板中,我接受JSONObject参数:
@(item : org.json.JSONObject)
@import helper._
@import helper.twitterBootstrap._
@import play.api.libs.json.Json
...
到目前为止,这么好。
直到我尝试在我的javascript中使用该对象:
如果我将我的对象@item放在模板中的任何地方,除了在javascript中,我得到这个: {&#34; 23254&#34;:&#34; Martys Pancakes&#34;,&#34; 23234&#34;:&#34; Joes place&#34;}; 这看起来像是一个正确形成的var。
我将JSONObject插入到这样的javascript中:
<script type="text/javascript">
businesses = @item;
我希望这样翻译:
businesses = {
"23332" : "Joe's hardware",
"56755" : "Marty's collision"
};
然而,该对象的行为并不像预期的那样。我怀疑我没有以正确的方式将参数传递给javascript。
任何人都可以开导我吗?感谢。
答案 0 :(得分:1)
我找到了自己问题的答案。结果很简单。首先,您不需要弄乱JSON。您将标准Java列表传递给Play模板。然后在Javascript变量花括号内遍历该列表。这是模板代码:
@(businesses: List[Business])
@import helper._
@import helper.twitterBootstrap._
...
<script type="text/javascript">
places = {
@for((item, index) <- businesses.zipWithIndex) {
@if(index != businesses.size-1) {
"@item.id" : "@Html(item.name)",}
else {"@item.id" : "@Html(item.name)"}
}
};
我使用了内置的zipWithIndex,因为我需要用逗号分隔每一行而不是最后一行。需要@Html()来转义HTML需要翻译的所有特殊字符。一旦javascript运行,你就会得到你的变量:
places = {
"345" : "Joe's Hardware",
"564" : "Jan's Party Store"
}