Как избежать строки JSON, содержащей символы новой строки, используя JavaScript?

Мне нужно сформировать строку JSON, в которой значение имеет новый символ строки. Это должно быть экранировано, а затем отправлено с использованием вызова AJAX. Может ли кто-нибудь предложить способ избежать строки с помощью JavaScript. Я не использую jQuery.

Ответ 1

Возьмите JSON и .stringify() его. Затем используйте метод .replace() и замените все вхождения \n на \\n.

EDIT:

Насколько я знаю, нет известных JS-библиотек для экранирования всех специальных символов в строке. Но вы можете связать метод .replace() и заменить все специальные символы следующим образом:

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
                                      .replace(/\\'/g, "\\'")
                                      .replace(/\\"/g, '\\"')
                                      .replace(/\\&/g, "\\&")
                                      .replace(/\\r/g, "\\r")
                                      .replace(/\\t/g, "\\t")
                                      .replace(/\\b/g, "\\b")
                                      .replace(/\\f/g, "\\f");
// myEscapedJSONString is now ready to be POST'ed to the server. 

Но это довольно неприятно, не так ли? Введите красоту функций, благодаря чему вы можете разбить код на куски и сохранить основной поток вашего script чистым и не содержать 8 цепочек .replace(). Таким образом, включите эту функциональность в функцию, называемую escapeSpecialChars(). Отпустите и привяжите его к prototype chain объекта String, поэтому мы можем вызвать escapeSpecialChars() непосредственно на объекты String.

Так же:

String.prototype.escapeSpecialChars = function() {
    return this.replace(/\\n/g, "\\n")
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
};

Как только мы определили эту функцию, основная часть нашего кода проста:

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server

Ответ 2

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

escape = function (str) {
  return str
    .replace(/[\\]/g, '\\\\')
    .replace(/[\"]/g, '\\\"')
    .replace(/[\/]/g, '\\/')
    .replace(/[\b]/g, '\\b')
    .replace(/[\f]/g, '\\f')
    .replace(/[\n]/g, '\\n')
    .replace(/[\r]/g, '\\r')
    .replace(/[\t]/g, '\\t');
};

Ответ 3

Как и вы, я изучал несколько комментариев и сообщений, чтобы заменить специальные escape-символы в моем JSON, который содержит внутри него объект html.

Мой объект - удалить специальные символы в объекте JSON, а также отобразить html, который находится внутри объекта json.

Вот что я сделал и надеюсь, что он очень прост в использовании.

Сначала я сделал JSON.stringify свой json-объект и JSON.Спасибо за результат.

Например,

JSON.parse(JSON.stringify(jsonObject));

И он решает мою проблему и выполняется с использованием Pure Javascript.

Ответ 4

Я боюсь сказать, что ответ, данный Алексом, довольно неверен, мягко говоря:

  • Некоторые символы, которые Алекс пытается убежать, не должны вообще избегать (например, и и);
  • \b не является символом обратного пространства, а скорее совпадением слов
  • Символы, которые необходимо экранировать, не обрабатываются.

Эта функция

escape = function (str) {
    // TODO: escape %x75 4HEXDIG ?? chars
    return str
      .replace(/[\"]/g, '\\"')
      .replace(/[\\]/g, '\\\\')
      .replace(/[\/]/g, '\\/')
      .replace(/[\b]/g, '\\b')
      .replace(/[\f]/g, '\\f')
      .replace(/[\n]/g, '\\n')
      .replace(/[\r]/g, '\\r')
      .replace(/[\t]/g, '\\t')
    ; };

представляется лучшим приближением.

Ответ 5

Небольшое обновление для одинарных кавычек

function escape (key, val) {
    if (typeof(val)!="string") return val;
    return val      
        .replace(/[\\]/g, '\\\\')
        .replace(/[\/]/g, '\\/')
        .replace(/[\b]/g, '\\b')
        .replace(/[\f]/g, '\\f')
        .replace(/[\n]/g, '\\n')
        .replace(/[\r]/g, '\\r')
        .replace(/[\t]/g, '\\t')
        .replace(/[\"]/g, '\\"')
        .replace(/\\'/g, "\\'"); 
}

var myJSONString = JSON.stringify(myJSON,escape);

Ответ 6

Это старый пост. но это может быть полезно для тех, кто использует angular.fromJson и JSON.stringify. escape() устарел. используйте вместо этого

var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.

ref http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp

Ответ 7

В JSON.stringify также есть второй параметр. Таким образом, более элегантным решением будет:

function escape (key, val) {
    if (typeof(val)!="string") return val;
    return val
      .replace(/[\"]/g, '\\"')
      .replace(/[\\]/g, '\\\\')
      .replace(/[\/]/g, '\\/')
      .replace(/[\b]/g, '\\b')
      .replace(/[\f]/g, '\\f')
      .replace(/[\n]/g, '\\n')
      .replace(/[\r]/g, '\\r')
      .replace(/[\t]/g, '\\t')
    ; 
}

var myJSONString = JSON.stringify(myJSON,escape);

Ответ 8

Это старый вопрос, но решение для меня не помогло, так как оно не разрешало всех случаев. Я наконец нашел ответ, который сделал работу здесь

Я выложу свое совместное решение как с помощью escape-кода и кодирования uri-компонента:

// implement JSON stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        }
        var rawString = (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
       return rawString;
    }
};
function escape (key, val) {
    if (typeof(val)!="string") return val;

    var replaced = encodeURIComponent(val);
    return replaced;
}

JSON.stringifyEscaped = function(obj){
    return JSON.stringify(obj,escape);
}

Ответ 9

Я получил такую ​​же ситуацию в одном из моих вызовов Ajax, где JSON выдавал ошибку из-за новой строки в поле Textarea. Решение, данное здесь, не сработало для меня. Поэтому я использовал функцию Javascript .escape, и она отлично работала. Затем, чтобы получить значение из JSON, я просто не привязан с помощью .unescape.

Ответ 10

При использовании любой формы Ajax в Интернете отсутствует подробная документация для формата ответов, полученных с сервера CGI. Некоторые записи здесь указывают на то, что новые строки в возвращаемых текстах или json-данных должны быть экранированы для предотвращения бесконечных циклов (зависаний) в преобразовании JSON (возможно, созданных путем бросания неперехваченного исключения), независимо от того, выполняются ли они автоматически с помощью jQuery или вручную с использованием JSON-анализа или системы JSON вызовы.

В каждом случае, когда программисты публикуют эту проблему, представлены неадекватные решения (чаще всего заменяя \n на\\n на отправляющей стороне), и дело отбрасывается. Их неадекватность обнаруживается при передаче строковых значений, которые случайно вставляют управляющие escape-последовательности, такие как имена путей Windows. Пример: "C:\Chris\Roberts.php", который содержит управляющие символы ^ c и ^ r, что может привести к преобразованию JSON строки { "file": "C:\Chris\Roberts.php" } в цикл навсегда. Один из способов генерации таких значений преднамеренно пытается передать предупреждения и сообщения об ошибках PHP с сервера на клиент, разумную идею.

По определению Ajax использует HTTP-соединения за кулисами. Такие соединения передают данные с использованием GET и POST, оба из которых требуют кодирования отправленных данных, чтобы избежать неправильного синтаксиса, включая управляющие символы.

Это дает достаточно намека на то, что кажется решением (требуется больше тестирования): использовать rawurlencode на стороне PHP (отправки) для кодирования данных и unescape на стороне Javascript (получающей) для декодирования данные. В некоторых случаях вы будете применять их ко всем текстовым строкам, в других случаях вы будете применять их только к значениям внутри JSON.

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

Ответ 11

используйте json_encode(), если ваш серверный скриптовый язык является php, json_encode() ускользает от новой строки и других неожиданных токенов (если php не ищет аналогичную функцию для вашего скриптового lan)

затем используйте $.parseJSON() в вашем javascript, сделанный!

Ответ 12

Я использовал встроенный jQuery.serialize(), чтобы извлечь значение из текстового поля, чтобы URL-адрес ввода. Пропроцесс состоит в том, что вам не нужно искать замену всех специальных char самостоятельно, а также сохранить новые строки и ускользнуть от html. Для сериализации для работы кажется, что поле ввода должно иметь атрибут имени, хотя он также добавляет тот же атрибут к экранированной строке, которую нужно заменить. Возможно, не то, что вы ищете, но оно работает для меня.

var myinputfield = jQuery("#myinputfield"); 
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');

Ответ 13

Похоже, это действительно древний пост :-) Но, ребята, лучший обходной путь, который у меня есть, чтобы на 100% работать без сложного кода, это использовать обе функции кодирования/декодирования для base64. Это atob() и btoa(). Безусловно, самый простой и лучший способ, не нужно беспокоиться, если вы пропустили какие-либо символы, которые нужно экранировать.

Джордж

Ответ 14

Лучше использовать JSON.parse(yourUnescapedJson);

Ответ 15

Используйте encodeURIComponent() для кодирования строки.

Например. var myEscapedJSONString = encodeURIComponent (JSON.stringify(myJSON));

Вам не нужно декодировать его, так как веб-сервер автоматически делает то же самое.

Ответ 16

Никогда не используйте регулярные выражения (я имею в виду, как никогда). Лучший и эффективный способ:

String.prototype.escapeJSON = function() {
    var result = "";
    for (var i = 0; i < this.length; i++)
    {
        var ch = this[i];
        switch (ch)
        {
            case "\\": ch = "\\\\"; break;
            case "\'": ch = "\\'"; break;
            case "\"": ch = '\\"'; break;
            case "\&": ch = "\\&"; break;
            case "\t": ch = "\\t"; break;
            case "\n": ch = "\\n"; break;
            case "\r": ch = "\\r"; break;
            case "\b": ch = "\\b"; break;
            case "\f": ch = "\\f"; break;
            case "\v": ch = "\\v"; break;
            default: break;
        }

        result += ch;
    }

    return result;
};