Подтвердить что ты не робот

Как избежать строк json в freemarker

Мы создаем успокоительный 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

4b9b3361

Ответ 1

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

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

Это поможет избежать кавычек, обратных косых черт, et. чтобы сделать ваш JS счастливым.

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

Ответ 2

Используйте макрос 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">