ฉันต้องสร้างสตริง 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
Ref: es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
เช่นเดียวกับคุณฉันได้ดูข้อคิดเห็นและโพสต์หลายรายการเพื่อแทนที่อักขระพิเศษใน JSON ของฉันซึ่งมีวัตถุ html ข้างในนั้น
วัตถุของฉันคือการลบอักขระพิเศษในวัตถุ JSON และยังแสดง html ที่อยู่ภายในวัตถุ json
นี่คือสิ่งที่ฉันทำและหวังว่าจะใช้งานได้ง่ายมาก
ครั้งแรกที่ฉันทำ JSON.string วัตถุ json ของฉันและ JSON.parse ผลลัพธ์
สำหรับเช่น:
JSON.parse(JSON.stringify(jsonObject));
และมันแก้ปัญหาของฉันและใช้งาน Javascript แบบเพียว
stackoverflow
ข้อผิดพลาด
JSON.parse(JSON.stringify($("body")))
ในไฟล์ html ที่มีเนื้อหาและบางตาราง $ ("body") เป็นวัตถุจาวาสคริปต์ แต่ stringify จะไม่สามารถแยกวิเคราะห์ได้
ฉันกลัวที่จะพูดว่าคำตอบที่ Alex ให้ไว้นั้นค่อนข้างไม่ถูกต้อง
ฟังก์ชั่นนี้
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 และ encode uri component:
// 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 ()ถ้า lang scripting ฝั่งเซิร์ฟเวอร์ของคุณคือ 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 double encode
ฉันได้รับสถานการณ์เดียวกันในการโทร Ajax ครั้งหนึ่งของฉันซึ่งJSON
เกิดข้อผิดพลาดเนื่องจากการขึ้นบรรทัดใหม่ในฟิลด์ Textarea วิธีแก้ปัญหาของที่นี่ไม่ได้ผลสำหรับฉัน ดังนั้นฉันจึงใช้.escape
ฟังก์ชั่นของ Javascript และใช้งานได้ดี จากนั้นเพื่อดึงค่าจากJSON
ฉันเพียงแค่ไม่ใช้ Escape .unescape
ใช้
ฉันใช้ built in ในjQuery.serialize ()เพื่อแยกค่าจาก textarea เพื่อ urlencode อินพุต ส่วนที่เป็นมือโปรคือคุณไม่ต้องทำการค้นหาแทนที่ char พิเศษทุกตัวด้วยตัวคุณเองและฉันก็ยังคงบรรทัดใหม่และ html ที่หนีออกมา สำหรับซีเรียลไลซ์สำหรับการทำงานดูเหมือนว่าฟิลด์อินพุตจำเป็นต้องมีแอ็ตทริบิวต์ name และมันยังเพิ่มแอ็ตทริบิวต์เดียวกันให้กับสตริงที่ใช้ Escape ซึ่งต้องถูกแทนที่ อาจไม่ใช่สิ่งที่คุณกำลังมองหา แต่มันก็ได้ผลสำหรับฉัน
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
เมื่อใช้ Ajax รูปแบบใด ๆ เอกสารรายละเอียดสำหรับรูปแบบของการตอบสนองที่ได้รับจากเซิร์ฟเวอร์ CGI ดูเหมือนว่าจะไม่เพียงพอบนเว็บ บางรายการในที่นี้ชี้ให้เห็นว่าบรรทัดใหม่ในข้อความที่ส่งคืนหรือข้อมูล json ต้องถูกหลีกเลี่ยงเพื่อป้องกันการวนซ้ำไม่สิ้นสุด (แฮงค์) ในการแปลง JSON (อาจสร้างขึ้นโดยการโยนข้อยกเว้นที่ไม่ถูกตรวจจับ) ไม่ว่าจะกระทำโดยอัตโนมัติ โทร
ในแต่ละกรณีที่โปรแกรมเมอร์โพสต์ปัญหานี้จะมีวิธีแก้ปัญหาไม่เพียงพอ (ส่วนใหญ่มักจะแทนที่ \ n ด้วย \\ n ทางด้านการส่ง) และเรื่องจะถูกทิ้ง ความไม่เพียงพอของข้อมูลเหล่านี้จะถูกเปิดเผยเมื่อส่งผ่านค่าสตริงที่ฝังลำดับการควบคุมการหนีโดยไม่ตั้งใจเช่นชื่อพา ธ ของ Windows ตัวอย่างคือ "C: \ Chris \ Roberts.php" ซึ่งมีอักขระควบคุม ^ c และ ^ r ซึ่งสามารถทำให้การแปลง JSON ของสตริง {"ไฟล์": "C: \ Chris \ Roberts.php"} เป็น วนซ้ำตลอดไป วิธีหนึ่งในการสร้างค่าดังกล่าวคือการพยายามส่งคำเตือน PHP และข้อความแสดงข้อผิดพลาดจากเซิร์ฟเวอร์ไปยังไคลเอนต์ซึ่งเป็นแนวคิดที่สมเหตุสมผล
ตามคำนิยาม Ajax ใช้การเชื่อมต่อ HTTP ที่อยู่เบื้องหลัง การเชื่อมต่อดังกล่าวส่งผ่านข้อมูลโดยใช้ GET และ POST ซึ่งทั้งสองอย่างนั้นต้องการการเข้ารหัสข้อมูลที่ส่งเพื่อหลีกเลี่ยงไวยากรณ์ที่ไม่ถูกต้องรวมถึงอักขระควบคุม
สิ่งนี้ให้คำแนะนำเพียงพอที่จะสร้างสิ่งที่ดูเหมือนว่าจะเป็นทางออก (ต้องมีการทดสอบเพิ่มเติม): ใช้ rawurlencode บนด้าน PHP (ส่ง) เพื่อเข้ารหัสข้อมูลและ unescape บนฝั่ง Javascript (ที่ได้รับ) เพื่อถอดรหัสข้อมูล ในบางกรณีคุณจะใช้สิ่งเหล่านี้กับสตริงข้อความทั้งหมดในกรณีอื่น ๆ คุณจะใช้กับค่าภายใน JSON เท่านั้น
หากความคิดนี้ถูกต้องตัวอย่างที่เรียบง่ายสามารถสร้างขึ้นเพื่อช่วยโปรแกรมเมอร์ในทุกระดับแก้ปัญหานี้ได้ในทันที
ดูเหมือนว่านี่เป็นโพสต์โบราณจริงๆ :-) แต่พวกที่ดีที่สุดที่ฉันมีเพื่อให้เป็น 100% ว่ามันทำงานได้โดยไม่ต้องใช้รหัสที่ซับซ้อนคือการใช้ทั้งการเข้ารหัส / ถอดรหัสไปยัง base64 เหล่านี้คือ atob () และ btoa () เท่าที่ผ่านมาวิธีที่ง่ายและดีที่สุดไม่ต้องกังวลหากคุณพลาดตัวละครใด ๆ ที่ต้องหลบหนี
จอร์จ
หาก Googles ของคุณเชื่อมโยงไปถึงคุณที่นี่และ api ของคุณโยนข้อผิดพลาดยกเว้นว่าเครื่องหมายอัญประกาศคู่ของ JSON ของคุณจะถูกหลบหนี ( "{\"foo\": true}"
) สิ่งที่คุณต้องทำคือการทำให้เป็นสองเท่าเช่นJSON.stringify(JSON.stringify(bar))
ใช้ 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;
};