Tôi phải tạo một chuỗi JSON trong đó một giá trị có ký tự dòng mới. Điều này phải được thoát và sau đó được đăng bằng cách sử dụng cuộc gọi AJAX. Có ai có thể đề xuất một cách để thoát chuỗi bằng JavaScript không. Tôi không sử dụng jQuery.
Tôi phải tạo một chuỗi JSON trong đó một giá trị có ký tự dòng mới. Điều này phải được thoát và sau đó được đăng bằng cách sử dụng cuộc gọi AJAX. Có ai có thể đề xuất một cách để thoát chuỗi bằng JavaScript không. Tôi không sử dụng jQuery.
Câu trả lời:
Lấy JSON của bạn và .stringify()
nó. Sau đó sử dụng .replace()
phương pháp và thay thế tất cả các lần xuất hiện \n
bằng \\n
.
BIÊN TẬP:
Theo như tôi biết, không có thư viện JS nổi tiếng nào để thoát tất cả các ký tự đặc biệt trong một chuỗi. Nhưng, bạn có thể xâu chuỗi .replace()
phương thức và thay thế tất cả các ký tự đặc biệt như thế này:
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.
Nhưng điều đó thật khó chịu phải không? Nhập vào vẻ đẹp của các hàm, trong đó chúng cho phép bạn chia mã thành nhiều phần và giữ cho luồng chính của tập lệnh của bạn sạch sẽ và không có 8 .replace()
cuộc gọi bị xiềng xích . Vì vậy, hãy đặt chức năng đó vào một chức năng được gọi là escapeSpecialChars()
. Chúng ta hãy đi trước và đính kèm nó vào prototype chain
các String
đối tượng, vì vậy chúng tôi có thể gọi escapeSpecialChars()
trực tiếp trên chuỗi các đối tượng.
Thích như vậy:
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");
};
Khi chúng ta đã xác định hàm đó, phần chính của mã của chúng ta đơn giản như sau:
var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server
Theo người dùng667073 đã đề xuất, ngoại trừ sắp xếp lại thay thế dấu gạch chéo ngược trước và sửa lỗi thay thế báo giá
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
và Paragraph separator
\u2029
. Tham chiếu: es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
Giống như bạn, tôi đã xem xét một số bình luận và bài đăng để thay thế các ký tự thoát đặc biệt trong JSON của tôi có chứa đối tượng html bên trong đó.
Đối tượng của tôi là loại bỏ các ký tự đặc biệt trong đối tượng JSON và cũng hiển thị html nằm trong đối tượng json.
Đây là những gì tôi đã làm và hy vọng nó rất đơn giản để sử dụng.
Đầu tiên tôi đã thực hiện JSON.opesify đối tượng json của tôi và JSON.parse kết quả.
Ví dụ:
JSON.parse(JSON.stringify(jsonObject));
Và nó giải quyết vấn đề của tôi và thực hiện bằng Pure Javascript.
stackoverflow
lỗi
JSON.parse(JSON.stringify($("body")))
trong một tệp html có phần thân và một vài bảng. $ ("body") là một đối tượng javascript nhưng Stringify sẽ không phân tích cú pháp.
Tôi sợ nói rằng câu trả lời được đưa ra bởi Alex là không chính xác, để nói một cách nhẹ nhàng:
Chức năng này
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')
; };
dường như là một xấp xỉ tốt hơn.
Một bản cập nhật nhỏ cho dấu ngoặc đơn
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);
đây là một bài viết cũ nhưng nó vẫn có thể hữu ích cho những người sử dụng angular.fromJson và JSON.opesify. thoát () bị phản đối sử dụng cái này thay thế
var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.
tham khảo http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
Ngoài ra còn có tham số thứ hai trên JSON.opesify. Vì vậy, giải pháp thanh lịch hơn sẽ là:
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);
Đây là một câu hỏi cũ nhưng giải pháp không hiệu quả với tôi vì nó không giải quyết được tất cả các trường hợp. Cuối cùng tôi đã tìm thấy một câu trả lời đã làm công việc ở đây
Tôi sẽ đăng giải pháp kết hợp cả hai bằng cách sử dụng thành phần thoát và mã hóa 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]
Sử dụng tốt hơn JSON.parse(yourUnescapedJson);
Sử dụng json_encode () nếu lang kịch bản phía máy chủ của bạn là PHP,
json_encode()
thoát khỏi dòng mới và các mã thông báo bất ngờ khác cho bạn (nếu không sử dụng PHP, hãy tìm chức năng tương tự cho ngôn ngữ kịch bản lệnh của bạn)
sau đó sử dụng $.parseJSON()
JavaScript của bạn!
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
Mã hóa kép php JSON.parse
Tôi đã gặp tình huống tương tự trong một trong các cuộc gọi Ajax của tôi, nơi JSON
đã xảy ra lỗi do dòng mới trong trường Textarea. Giải pháp đưa ra ở đây không hiệu quả với tôi. Vì vậy, tôi đã sử dụng .escape
chức năng của Javascript và nó hoạt động tốt. Sau đó, để lấy giá trị từ JSON
, tôi chỉ không sử dụng .unescape
.
Tôi đã sử dụng hàm jQuery.serialize () tích hợp để trích xuất giá trị từ textarea để urlencode đầu vào. Phần chuyên nghiệp là bạn không phải tự mình tìm kiếm thay thế mọi char đặc biệt và tôi cũng giữ các dòng mới và thoát html. Để tuần tự hóa hoạt động, có vẻ như trường đầu vào cần phải có thuộc tính name và nó cũng thêm thuộc tính tương tự vào chuỗi đã thoát cần được thay thế. Có thể không phải là những gì bạn đang tìm kiếm nhưng nó làm việc cho tôi.
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
Khi sử dụng bất kỳ dạng Ajax nào, tài liệu chi tiết về định dạng của các phản hồi nhận được từ máy chủ CGI dường như còn thiếu trên Web. Một số mục ở đây chỉ ra rằng các dòng mới trong văn bản trả về hoặc dữ liệu json phải được thoát để tránh các vòng lặp vô hạn (treo) trong chuyển đổi JSON (có thể được tạo bằng cách ném một ngoại lệ chưa được phát hiện), cho dù được thực hiện tự động bởi jQuery hoặc sử dụng phân tích cú pháp JSON của thư viện các cuộc gọi.
Trong mỗi trường hợp các lập trình viên đăng vấn đề này, các giải pháp không đầy đủ được trình bày (thường thay thế \ n bằng \ n ở phía gửi) và vấn đề được loại bỏ. Sự không đầy đủ của chúng được tiết lộ khi truyền các giá trị chuỗi vô tình nhúng các chuỗi thoát kiểm soát, chẳng hạn như tên đường dẫn Windows. Một ví dụ là "C: \ Chris \ Roberts.php", chứa các ký tự điều khiển ^ c và ^ r, có thể gây ra chuyển đổi JSON của chuỗi {"file": "C: \ Chris \ Roberts.php"} thành vòng lặp mãi mãi. Một cách tạo ra các giá trị như vậy là cố tình truyền các thông báo lỗi và cảnh báo PHP từ máy chủ đến máy khách, một ý tưởng hợp lý.
Theo định nghĩa, Ajax sử dụng các kết nối HTTP phía sau hậu trường. Các kết nối như vậy truyền dữ liệu bằng GET và POST, cả hai đều yêu cầu mã hóa dữ liệu đã gửi để tránh cú pháp sai, bao gồm các ký tự điều khiển.
Điều này cung cấp đủ gợi ý để xây dựng giải pháp dường như là một giải pháp (cần thử nghiệm nhiều hơn): sử dụng rawurlencode ở phía PHP (gửi) để mã hóa dữ liệu và bỏ thông báo ở phía Javascript (nhận) để giải mã dữ liệu. Trong một số trường hợp, bạn sẽ áp dụng chúng cho toàn bộ chuỗi văn bản, trong các trường hợp khác, bạn sẽ chỉ áp dụng chúng cho các giá trị bên trong JSON.
Nếu ý tưởng này trở nên chính xác, các ví dụ đơn giản có thể được xây dựng để giúp các lập trình viên ở tất cả các cấp giải quyết vấn đề này một lần và mãi mãi.
Có vẻ như đây thực sự là một bài viết cổ xưa :-) Nhưng các bạn, cách giải quyết tốt nhất mà tôi có, là 100% nó hoạt động mà không cần mã phức tạp, là sử dụng cả hai chức năng mã hóa / giải mã thành base64. Đây là atob () và btoa (). Cho đến nay, cách dễ nhất và tốt nhất, không cần phải lo lắng nếu bạn bỏ lỡ bất kỳ nhân vật nào để trốn thoát.
George
Sử dụng encodeURIComponent () để mã hóa chuỗi.
Ví dụ. var myEscopedJSONString = encodeURIComponent (JSON.opesify (myJSON));
Bạn không cần giải mã nó vì máy chủ web sẽ tự động làm như vậy.
Đừng bao giờ sử dụng các biểu thức thông thường (ý tôi là không bao giờ như vậy). Cách tốt nhất và hiệu quả:
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;
};