如何将JSONObject传递给Play Framework for Java模板的javascript?

时间:2014-06-19 19:35:54

标签: java javascript json playframework-2.0

我正在使用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。

任何人都可以开导我吗?感谢。

1 个答案:

答案 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"
}