Значение JsValue для фреймворка в шаблоне HTML

#html #json #scala #playframework

#HTML #json #scala #playframework

Вопрос:

Я пытаюсь определить объект json в шаблоне с помощью JsValue play (версия 2.2.2). Проблема в том, " что преобразуется в amp;quot;

 @(org: db.Tables.OrganizationRow)

@import models.format.EntityFormat._
@import play.api.libs.json.Json

<script  type="text/javascript">
    var org = @Json.toJson(org);
</script>
  

результаты в:

 {amp;quot;idamp;quot;:16,amp;quot;useridamp;quot;:amp;quot; ... more data ... };
  

Как я могу получить правильный json в шаблоне scala html?

Ответ №1:

Определите его так Html , чтобы он не экранировался автоматически.

 var org = @Html(Json.stringify(Json.toJson(org)));
  

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

1. Кстати, для чего @Javascript @Txt используется ? Они находятся в одном пакете с @Html , но я думаю, что они просто ничего не делают.

2. @Renkai Они используются, если вы используете шаблон другого типа в первую очередь. Например, в a views/foo.scala.js , который вы бы использовали @JavaScript(bar) для необработанного (не экранированного JS) вывода значения bar . Как говорится в документах: «Если вы хотите вывести необработанный фрагмент содержимого, оберните его в тип содержимого шаблона» (т.е. @Html для .html, @Javascript для .js)

3. Такой подход является правильным для надежных данных, но это не безопасно, в общем (если таковые имеются данные ненадежных затем злоумышленник может вырваться из контекста JS с «</script>»или «<!—«, even with correct js escaping). См. uploadcare.com/blog/vulnerability-in-html-design . В настоящее время не существует полностью безопасного механизма экранирования для этого контекста, предоставляемого Play.