Как мне передать JSONObject в Play Framework для javascript шаблона Java?

#java #javascript #json #playframework-2.0

#java #javascript #json #playframework-2.0

Вопрос:

Я работаю с Play framework (2.4) для Java. Я хочу передать 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;
}
  

В моем шаблоне воспроизведения я принимаю параметр JSONObject:

 @(item : org.json.JSONObject)

@import helper._
@import helper.twitterBootstrap._
@import play.api.libs.json.Json 
  

Пока все хорошо.

Пока я не попытаюсь использовать объект в своем javascript:

Если я помещу свой объект @item в любое место шаблона, кроме как внутри javascript, я получу это: {«23254″:»Martys Pancakes»,»23234″:»Joes place»}; который выглядит как правильно сформированный var для меня.

Я вставляю JSONObject в javascript следующим образом:

 <script type="text/javascript">

 businesses = @item;
  

и я ожидаю, что это будет выглядеть следующим образом:

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

И все же объект ведет себя не так, как ожидалось. Я подозреваю, что я неправильно передаю параметр в javascript.

Кто-нибудь может меня просветить? Спасибо.

Комментарии:

1. var businesses = ... ?

Ответ №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"
}