Мне нужно сформировать строку JSON, в которой значение имеет новый символ строки. Это должно быть экранировано, а затем отправлено с использованием вызова AJAX. Может ли кто-нибудь предложить способ избежать строки с помощью JavaScript. Я не использую jQuery.
Как избежать строки JSON, содержащей символы новой строки, используя JavaScript?
Ответ 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;
};