#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"
}