我如何将JSONObject传递给Java模板's javascript的Play框架?

How do I pass a JSONObject to a Play Framework for Java template's javascript?

本文关键字:javascript 框架 Play 模板 JSONObject Java      更新时间:2023-09-26

我正在使用Java的Play框架(2.4)。我想传递一个JSONObject到一个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之外的模板的任何地方,我得到这个:{"23254":"Martys pancake","23234":"Joes place"};在我看来,这是一个格式正确的变量。

我插入JSONObject到javascript像这样:

<script type="text/javascript">
 businesses = @item;

,我希望翻译成这样:

businesses = {
    "23332"  : "Joe's hardware",
    "56755"  : "Marty's collision"
};

但是对象的行为却不符合预期。我怀疑我没有以正确的方式将参数传递给javascript。

有谁能开导我一下吗?谢谢。

我找到了自己问题的答案。结果很简单。首先,您不需要乱搞JSON。你将一个标准的Java List传递给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"
}