Я повинен сформувати рядок JSON, у якому значення має новий рядковий символ. Цього потрібно уникнути, а потім опублікувати за допомогою AJAX-дзвінка. Чи може хтось запропонувати спосіб вийти з рядка за допомогою JavaScript. Я не використовую jQuery.
Я повинен сформувати рядок JSON, у якому значення має новий рядковий символ. Цього потрібно уникнути, а потім опублікувати за допомогою AJAX-дзвінка. Чи може хтось запропонувати спосіб вийти з рядка за допомогою JavaScript. Я не використовую jQuery.
Відповіді:
Візьміть свій JSON і .stringify()
це. Потім використовуйте .replace()
метод і замінити всі входження \n
з\\n
.
Редагувати:
Наскільки я знаю, не існує відомих бібліотек 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.
Але це досить неприємно, чи не так? Введіть красу функцій, оскільки вони дозволяють розбити код на шматки та зберегти основний потік сценарію чистим та вільним від 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
Згідно з запропонованим користувачем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');
};
Line separator
\u2028
та Paragraph separator
\u2029
. Посилання: es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
Як і ви, я розглядав декілька коментарів і публікацій, щоб замінити спеціальні символи евакуації в моєму JSON, який містить html-об’єкт всередині цього.
Моя мета полягає в тому, щоб видалити спеціальні символи в об'єкті JSON, а також надати HTML, який знаходиться всередині об'єкта json.
Ось що я зробив і сподіваюся, що його дуже просто у використанні.
Спершу я зробив JSON.stringify мій об’єкт json і JSON.парати результат.
Наприклад:
JSON.parse(JSON.stringify(jsonObject));
І це вирішує мою проблему і робиться за допомогою чистого Javascript.
stackoverflow
помилкою
JSON.parse(JSON.stringify($("body")))
у HTML-файлі з тілом та кількома таблицями. $ ("body") - це об'єкт javascript, але під час редагування не вдасться його проаналізувати.
Боюся сказати, що відповідь, яку дав Алекс, є досить неправильною, м'яко кажучи:
Ця функція
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')
; };
видається кращим наближенням.
Невелике оновлення для одиничних цитат
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);
це стара посада. але це все ще може бути корисним для тих, хто використовує 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
Є також другий параметр на 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);
Це давнє питання, але рішення не спрацювало для мене, оскільки не вирішило всіх випадків. Нарешті я знайшов відповідь, яка зробила тут роботу
Я опублікую своє комбіноване рішення як із використанням компонента 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);
}
escape = (string) -> JSON.stringify(string)[1...-1]
Краще використовувати JSON.parse(yourUnescapedJson);
Використовуйте json_encode (), якщо язиком сценарію на вашому сервері є PHP,
json_encode()
уникає нового рядка та інших несподіваних маркерів для вас (якщо не використовується PHP, шукайте подібну функцію для вашої мови сценаріїв)
потім використовуйте $.parseJSON()
у своєму JavaScript, зробили!
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
php JSON.parse подвійний кодування
У мене трапилася така ж ситуація в одному з моїх дзвінків у "Аякс", де JSON
було помилки через нову лінію в полі "Текстарея". Наведене тут рішення не працювало для мене. Тому я використав .escape
функцію Javascript, і вона працювала чудово. Потім, щоб отримати значення з JSON
, я просто не визначив, використовуючи .unescape
.
Я використовував вбудований в jQuery.serialize () для отримання значення з textarea для urlencode введення. Профільна частина полягає в тому, що вам не доведеться шукати заміни кожного спеціального символу самостійно, і я також зберігаю нові рядки та уникає html. Щоб серіалізація працювала, здається, що в полі введення потрібно мати атрибут імені, але він також додає такий же атрибут до ряду, що уникнув, який потрібно замінити. Можливо, не те, що ви шукаєте, але це працює для мене.
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
При використанні будь-якої форми Ajax детальна документація щодо формату відповідей, отриманих від сервера CGI, здається, в Інтернеті бракує. Деякі записи тут зазначають, що слід уникати нових рядків у повернених текстах або json даних для запобігання нескінченних циклів (зависань) при перетворенні JSON (можливо, створених шляхом викидання невиконаного винятку), будь то зроблено автоматично jQuery або вручну за допомогою системи Javascript або бібліотеки JSON розбору дзвінки.
У кожному випадку, коли програмісти ставлять цю проблему, представлені неадекватні рішення (найчастіше замінюючи \ n на \\ n на стороні, що надсилає), і питання залишається. Їх неадекватність виявляється при передачі рядкових значень, які випадково вбудовують керуючі послідовності аварійних змін, наприклад, імена шляхів Windows. Приклад - "C: \ Chris \ Roberts.php", який містить контрольні символи ^ c і ^ r, що може викликати перетворення JSON рядка {"файл": "C: \ Chris \ Roberts.php"} в петля назавжди. Один із способів генерування таких значень - це навмисна спроба передачі PHP повідомлень про попередження та помилки від сервера до клієнта, розумна ідея.
За визначенням, Ajax використовує HTTP-з'єднання за кадром. Такі з'єднання передають дані за допомогою GET та POST, обидва з яких вимагають кодування відправлених даних, щоб уникнути неправильного синтаксису, включаючи символи управління.
Це дає достатньо підказки для побудови того, що, здається, є рішенням (для цього потрібне додаткове тестування): використовувати rawurlencode на PHP (відсилаючій) стороні для кодування даних, а не розгорнути на стороні Javascript (отримання) для декодування даних. У деяких випадках ви застосовуватимете їх до цілих текстових рядків, в інших випадках ви застосовуватимете їх лише до значень усередині JSON.
Якщо ця ідея виявиться правильною, можна створити прості приклади, щоб допомогти програмістам на всіх рівнях вирішити цю проблему раз і назавжди.
Схоже, це справді давня публікація :-) Але, хлопці, найкращий спосіб вирішити це для мене, на 100%, щоб він працював без складного коду, - це використовувати обидві функції кодування / декодування для base64. Це атоб () та бтоа (). На сьогоднішній день найпростіший і найкращий спосіб, не потрібно турбуватися, якщо ви пропустили будь-які символи, на яких втекли.
Джордж
Використовуйте encodeURIComponent () для кодування рядка.
Напр. var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));
Не потрібно розшифровувати його, оскільки веб-сервер автоматично робить те саме.
Ніколи не використовуйте регулярні вирази (я маю на увазі, як ніколи взагалі). Найкращий та ефективний спосіб:
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;
};