Как избежать JSON-строк в FreeMarker - PullRequest
20 голосов
/ 17 июня 2011

Мы создаем успокоительный API, используя Spring MVC и freemarker в качестве языка шаблонов. Мы решили создать ответы json в freemarker

Пример freemarker.ftl:

{
"field1" : "${response.value1}",
"field2" : "${response.value2}"
}

У нас возникает проблема, когда строки в значениях содержат кавычки (или любые другие символы в синтаксисе JSON).

Вопрос: Как я могу избежать этих строк, используя freemarker?

Мы рассмотрели ?xml или ?html, но они не охватывают все соответствующие символы (например, \).

РЕДАКТИРОВАТЬ: ?js_string будет экранировать строку в соответствии с JavaScript. А поскольку JSON основан на JavaScript (JavaScript Object Notation), он будет работать.

EDIT2: В случае, если всплывает одиночная кавычка, ?js_script сбрасывает ее, что снова приводит к неверному JSON. Исправление для него:

${variable?js_string?replace("\\'", "\'")} 

и если вы действительно хотите быть разборчивым:

${variable?js_string?replace("\\'", "\'")?replace("\\>",">")}

В качестве альтернативы, если вы используете Spring: http://www.springsurf.org/sites/1.0.0.M3/spring-webscripts/spring-webscripts-documentation/reference/html-single/index.html#js-api-index-org.springframework.extensions.webscripts.json.jsonutils

Ответы [ 2 ]

29 голосов
/ 17 июня 2011

Вы ищете оператора ?js_string.

{
"field1" : "${response.value1?js_string}",
"field2" : "${response.value2?js_string}"
}

, который позаботится о экранировании кавычек, обратной косой черты и так далее.Чтобы сделать ваш JS счастливым.

Редактировать : Я только что увидел, что в Freemarker 2.3.19 введен оператор ?json_string.Смотрите здесь , чтобы узнать, как именно это работает.И было много радости ...

2 голосов
/ 13 февраля 2012

Используйте макрос FreeMarker , чтобы объединить все ответы выше, делая шаблон более читабельным и понятным:

<#macro json_string string>${string?js_string?replace("\\'", "\'")?replace("\\>", ">")}</#macro>
{
"field1" : "<@json_string "${response.value1}"/>",
"field2" : "<@json_string "${response.value2}"/>"
}

Если вы хотите повторно использовать макрос в нескольких шаблонах,поместите его в свой собственный файл и включите файл вместо дублирования макроса:

<#include "/path/to/macro.ftl">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...