วิธีการหลีกเลี่ยงอัญประกาศใน JSON


306

ฉันพยายามที่จะแสดงเครื่องหมายคำพูดคู่ แต่มันแสดงให้เห็นว่าหนึ่งในแบ็กสแลช:

"maingame": {
    "day1": {
        "text1": "Tag 1",
        "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
    }
}

เมื่อการแสดงผลใน html \"Example text\"มันแสดงให้เห็นว่าเป็น วิธีที่ถูกต้องคืออะไร?

คำตอบ:


446

ลองสิ่งนี้:

"maingame": {
  "day1": {
    "text1": "Tag 1",
     "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
  }
}

(แบ็กสแลชเพียงอันเดียว ( \) หน้าเครื่องหมายคำพูด)


9
@DWGuru นี้มีอะไรจะทำอย่างไรกับความคิดเห็นก็เป็นลำดับหนีตามที่อธิบายไว้ในecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (. ตราไว้หุ้นละ 9 - สตริง) ที่มันพูดว่า:All characters may be placed within the quotation marks except for the characters that must be escapedและแล้วมัน ระบุ:\" represents the quotation mark character (U+0022)
mastazi

ด้วยเหตุผลบางอย่างนี่ใช้ไม่ได้กับ JSON.parse () ใน JS
SacWebDeveloper

32

ควรใช้เมื่อใดและที่ไหน\\\"แทน ตกลงถ้าคุณเป็นเหมือนฉันคุณจะรู้สึกงี่เง่าเหมือนที่ฉันทำเมื่อฉันรู้ว่าสิ่งที่ฉันทำหลังจากที่ฉันพบหัวข้อนี้

หากคุณกำลังสร้างไฟล์ข้อความ. json / สตรีมและนำเข้าข้อมูลจากที่นั่นสตรีมหลักจะตอบเพียงแบ็กสแลชหนึ่งคำก่อนเครื่องหมายคำพูดคู่: \"เป็นสิ่งที่คุณกำลังมองหา

อย่างไรก็ตามถ้าคุณชอบฉันและคุณกำลังพยายามหา w3schools.com "Tryit Editor" เพื่อให้ได้เครื่องหมายคำพูดคู่ในผลลัพธ์ของ JSON.parse (ข้อความ) ดังนั้นสิ่งที่คุณกำลังมองหาคือ triple \\\"ทับขวาราคาคู่ นี้เป็นเพราะคุณกำลังสร้างสตริงข้อความของคุณภายใน HTML <script>บล็อกและเป็นครั้งแรกแทรกทับขวาคู่เครื่องหมายเดียวในตัวแปรสตริงแล้วต่อไปนี้ราคาคู่ทับขวาแทรกราคาคู่เป็นสตริงเพื่อให้สตริงสคริปต์ส่งผลให้มี\"จาก คำตอบมาตรฐานและตัวแยกวิเคราะห์ JSON จะแยกวิเคราะห์นี้เป็นเพียงคำพูดสองครั้ง

<script>
  var text="{";
  text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""';
  text += "}";
  var obj=JSON.parse(text);
</script>

+1: เนื่องจากเป็นสตริงข้อความ JavaScript เครื่องหมายคำพูดซ้อนทับแบ็กสแลชคู่\\"จึงใช้งานได้เช่นกัน เนื่องจากเครื่องหมายคำพูดคู่ไม่จำเป็นต้องใช้ Escape ในสตริงที่ยกมาเดี่ยวเช่น'\"'และ'"'ส่งผลให้สตริง JS เดียวกัน


โซลูชันนี้ช่วยในเวอร์ชัน Swift ที่สร้างสตริงที่เพิ่มเข้ากับอาร์กิวเมนต์สำหรับ JSON POST
Nick N

18

มันแสดงเครื่องหมายแบ็กสแลชเพราะคุณกำลังหนีแบ็กสแลชด้วยเช่นกัน

นอกเหนือจากเครื่องหมายคำพูดคู่คุณต้องหลีกเลี่ยงแบ็กสแลชหากคุณต้องการรวมไว้ในสตริงที่ยกมา JSON ของคุณ อย่างไรก็ตามหากคุณต้องการใช้แบ็กสแลชในลำดับการหลีกเลี่ยงแน่นอนว่าคุณไม่ควรหลีกเลี่ยง


9

โปรดทราบว่าสิ่งนี้เกิดขึ้นบ่อยที่สุดเมื่อเนื้อหามีการ "เข้ารหัสสองครั้ง" ซึ่งหมายความว่าอัลกอริทึมการเข้ารหัสถูกเรียกโดยไม่ตั้งใจสองครั้ง

การโทรครั้งแรกจะเข้ารหัสค่า "text2":

จาก: Heute startet unsurund Rundreise "ตัวอย่างข้อความ" Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: รักษาวันที่เริ่มต้นไม่เป็น Rundreise \ "ตัวอย่างข้อความ \" Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

การเข้ารหัสครั้งที่สองจะแปลงอีกครั้งโดยหลีกเลี่ยงอักขระที่ถูกหลบหนีไปแล้ว:

จาก: Heute startet unsund Rundreise \ "ตัวอย่างข้อความ \" Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startet unsere Rundreise \\ "ตัวอย่างข้อความ \\\" Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

ดังนั้นหากคุณมีความรับผิดชอบในการนำเซิร์ฟเวอร์มาใช้ให้ตรวจสอบเพื่อให้แน่ใจว่าไม่มีสองขั้นตอนในการพยายามเข้ารหัสเนื้อหาเดียวกัน


6
ฉันเชื่อว่าตัวเข้ารหัสจะหลบหนีสวิตช์หลบหนีดังนั้นฉันจึงคิดว่าตัวที่สองถึงของคุณ:ควรอ่าน: "Heute startet unsere Rundreise \\\" ตัวอย่างข้อความ \\\ "แท็ก Jeden wird ein neues Reiseziel angesteuert bis wir
Jonathan Mee

1
@ Jonathan Mee: เพิ่งแก้ไขคำตอบตามคำแนะนำของคุณ มันถูกเขียนในทางทฤษฎีอย่างถูกต้องกับ 3 backslashes แต่ stackoverflow ยังใช้เครื่องหมายสำหรับ quoting และแปลงที่ 1 backslashes สองให้เป็นหนึ่งเดียวทับขวา
huha

5

ถ้าคุณต้องการที่จะหลบหนีอ้างคู่ใน JSON ใช้ \\ เพื่อหนีมัน

ตัวอย่างถ้าคุณต้องการสร้าง json ของวัตถุจาวาสคริปต์ต่อไปนี้

{time: '7 "o" clock'}

จากนั้นคุณต้องเขียนด้วยวิธีดังต่อไปนี้

'{"time":"7 \\"o\\" clock"}'

ถ้าเราแยกวิเคราะห์โดยใช้ JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}')

ผลลัพธ์จะเป็น

{time: "7 "o" clock"}

1

เพื่อหลีกเลี่ยงแบ็กสแลชที่ทำให้เกิดปัญหากับข้อมูล JSON ฉันใช้ฟังก์ชั่นนี้

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};

6
ฉันขอแนะนำให้โปรแกรมเมอร์เขียนโปรแกรมเข้ารหัสเนื้อหาแทนที่จะลบ (หรือ "ล้างข้อมูล") เนื้อหา เคยมีความคิดของข้อมูลฐานข้อมูล "ล้าง" นี้ - โดยเฉพาะการลบอัญประกาศ (') โดยเฉพาะ โปรแกรมเมอร์ไม่ได้ตระหนักว่าผู้ใช้ไม่สามารถใช้นามสกุลของตัวเอง (O'Doul) ฉันหวังว่าโปรแกรมเมอร์ของวันนี้ใช้วิธีการอื่นเพื่อรับเนื้อหาต้นฉบับลงในฐานข้อมูลโดยไม่ต้องลอกหรือล้างข้อมูล
DanBaker

โอเคฉันถอดชิ้นส่วนลอกตัวละครออกเพื่อเอาใจมวลชน @DanBaker โปรดจำไว้ว่าการลอกข้อความของตัวละครอาจเป็นวิธีเดียวที่จะทำให้ JS ปลอดภัยในแอปไคลเอ็นต์ ฆ่าเชื้อ HTML เชิงมุมด้วยเหตุผลนี้ตามค่าเริ่มต้น
mbokil

ฉันเห็นด้วย 100% มีบางครั้งที่ข้อมูลจะต้องถูกทำให้สะอาด ... และ XSS เป็นหนึ่งในนั้น ขอบคุณสำหรับการชี้ว่า
DanBaker

0

สำหรับผู้ที่ต้องการใช้ powershell นักพัฒนา นี่คือบรรทัดที่จะเพิ่มใน settings.json ของคุณ:

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.