Двойное кодирование для 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() 
})
Другие вопросы по тегам