Двойное кодирование для JSON
В большинстве моих функций AJAX я должен дважды кодировать свободный текст, введенный пользователем, т.е. я должен делать encodeURIComponent(encodeURIComponent(myString)).
Если я делаю это только один раз, большинство символов, кроме двойных кавычек и длинных дефисов, работают.
Если я предупреждаю результат из одного кодирования, кавычки кодируются, но это нарушает строку JSON, поэтому я запутался.
Это ошибка с JavaScript или я что-то упустил? Это связано с тем, что вам нужно дважды кодировать амперсанд в PHP, чтобы заставить его работать?
Привет,
Вот код, который позволяет пользователю хранить заметки против чего-либо:
function saveAdminNote() {
var note = encodeURIComponent(encodeURIComponent($('#adminNote').val().replace(/(\r\n|\n|\r)/gm,""))) ;
JSON = '{"mode":"UPDATE_INTNOTE", "jobid":'+jobId+', "note":"'+note+'"}' ;
clearTimeout(tOut2) ;
tOut2 = setTimeout(function(){
$.ajax({
data: 'dataString='+JSON,
url: 'core/job-builder-controlV2.php',
type: 'POST',
success: function(data){
if(data)
{
$.prompt(data) ;
}
}
})
}, 250) ;
}
Так что, если моя структура данных плоская, нет никакого преимущества в использовании JSON вообще?
У меня сложилось впечатление, что JSON дал немного больше безопасности?
2 ответа
Основная проблема заключается в том, что вы пытаетесь создать JSON путем объединения строк (вместо использования библиотеки JSON) … и кодирования частей этих строк (вместо кодирования результирующей строки JSON (то есть данных без URI, которые вы хотите поместить в URI)... что jQuery сделает для вас).
Если вы хотите отправить JSON как часть запроса данных, закодированных в форме, вы должны:
$.ajax({
data: {
dataString: JSON.stringify({
"mode": "UPDATE_INTNOTE",
"jobid": jobId,
"note": $('#adminNote').val()
})
},
…
Так как здесь у вас плоская структура данных (то есть нет объектов или массивов в данных), вам вообще не нужно использовать JSON.
$.ajax({
data: {
"mode": "UPDATE_INTNOTE",
"jobid": jobId,
"note": $('#adminNote').val()
},
(Тогда в вашем PHP, просто доступ $_POST['mode']
и т. д. вместо анализа JSON, а затем получения данных из результирующего объекта)
Не создавайте JSON вручную, пусть правильно JSON.stringify
Метод сделает всю работу за вас (и не перезаписывает глобальный объект JSON тоже).
json = JSON.stringify({
"mode":"UPDATE_INTNOTE",
"jobid": jobId,
"note": $('#adminNote').val()
})