Значение JSON с апострофом

У меня есть элемент с атрибутом rel, который содержит строку JSON, например:

rel='{"id":"#id#","name":"#name#"}'

Затем в моем коде javascript я использую $.parseJSON для анализа этих данных. Это работает правильно - за исключением случаев, когда name содержит апостроф. Я пробовал использовать jsStringFormat, холодный сплав replace, который заменяет все одинарные кавычки на экранированные одинарные кавычки и т. Д., Но я не могу найти правильное решение. Я знаю, что это, вероятно, просто, но как мне получить код для правильной передачи значений с апостропами / одинарными кавычками с использованием json?

Этот код работает, но удаляет апострофы, которые я хотел бы сохранить:

rel='{"id":"#id#","name":"#replace(name,"'","","all")#"}'

Это не работает:

rel='{"id":"#id#","name":"#replace(name,"'","\'","all")#"}'

И не делает:

rel='{"id":"#id#","name":"#replace(name,"'","\\\'","all")#"}'

Or:

rel='{"id":"#id#","name":"#replace(name,"'",""","all")#"}'

Or:

rel='{"id":"#id#","name":"#jsStringFormat(name)#"}'

person froadie    schedule 27.08.2012    source источник
comment
Чтобы правильно избежать двойных кавычек в атрибутах HTML, используйте "   -  person cspolton    schedule 28.08.2012
comment
Почему вы не можете просто использовать serializeJson?   -  person Peter Boughton    schedule 28.08.2012


Ответы (3)


После долгих экспериментов я наконец-то заставил это работать :)

rel='{"id":"#id#","name":"#replace(name,"'","&##39;","all")#"}'
person froadie    schedule 27.08.2012
comment
Этот ответ является взломом и не должен быть рекомендуемым решением. Это решает проблему с апострофом, но по-прежнему позволяет выводить другие недопустимые символы. например если в имени есть амперсанд. Правильный ответ - правильно кодировать строки для контекста, в котором они используются. - person nosilleg; 31.08.2012

Проблема, с которой вы столкнулись, заключается в том, что вы имеете дело со строкой в ​​двух контекстах. Вы должны убедиться, что веревка безопасна в обоих случаях.

Строка JSON:

Самый простой способ сделать код JSON безопасным - использовать функцию SerializeJSON. / a> для преобразования объекта ColdFusion в допустимый JSON.

Таким образом, ваш код может стать:

rel='#SerializeJSON({"id"=Variables.id,"name"=Variables.name})#'

Строка атрибута HTML:

Следующий контекст, с которым вам нужно иметь дело, - это то, что вы хотите, чтобы строка была допустимым значением атрибута html.

В ColdFusion 10 это можно сделать с помощью функции EncodeForHTMLA. а>.

rel='#EncodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'

Если вы используете что-то до CF10, то лучше всего использовать кодировщик ESAPI. (Это было включено в патчи некоторых версий ColdFusion)

rel='#CreateObject("java", "org.owasp.esapi.ESAPI").encoder().encodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'

Я лично использую вспомогательный CFC для работы с кодировщиком ESAPI в CF9, поэтому CreateObject вызывается только один раз и повторно используется для всех применений его методов.

person nosilleg    schedule 28.08.2012

В JavaScript избегайте одинарных кавычек в строках с помощью \.

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

rel="{"id":"#id#","name":"#name#"}"
person cspolton    schedule 27.08.2012
comment
Я использую переменную coldfusion, а не литерал. Знаки фунта обозначают переменную - person froadie; 27.08.2012
comment
@froadie: Я изменил пример, чтобы отразить ваши переменные. - person cspolton; 27.08.2012
comment
это не работает, я не думаю, что это правильный синтаксис JSON - person froadie; 27.08.2012
comment
Если вы просматриваете исходный код HTML, какой результат вы получите от coldfusion? - person cspolton; 27.08.2012
comment
он завершает всю строку JSON апострофом в имени - person froadie; 28.08.2012
comment
Апострофы действительны в JSON, и их не нужно экранировать. См .: stackoverflow.com/questions/2275359/ - person cspolton; 28.08.2012
comment
@Spolto Апострофы действительны в JSON, но должны быть экранированы в атрибуте HTML. Это проблема, с которой сталкивается Фроуди. - person nosilleg; 28.08.2012