JSONで二重引用符をエスケープする方法


306

二重引用符を表示しようとしていますが、バックスラッシュの1つが表示されています。

"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> "
  }
}

\引用符の前にバックスラッシュ()を1つだけ)。


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 2017年

何らかの理由で、これはJSのJSON.parse()では機能しません。
SacWebDeveloper

32

\\\"代わりにいつどこで使用するか。私のような人なら、このスレッドを見つけて自分がやっていることに気付いたときと同じように、ばかげた感じになるでしょう。

.jsonテキストファイル/ストリームを作成し、そこからデータをインポートする場合、二重引用符の前の1つのバックスラッシュのメインストリームの回答:\"探しているものです。

ただし、あなたが私と同じで、w3schools.comの「Tryit Editor」にJSON.parse(text)の出力で二重引用符を付けようとしている場合、探しているのはトリプルです。バックスラッシュ二重引用符\\\"。これは、HTML <script>ブロック内でテキスト文字列を構築していて、最初の二重円記号が単一の円記号を文字列変数に挿入し、次の円記号二重引用符が二重引用符を文字列に挿入して、結果のスクリプト文字列に\"from が含まれるようにするためです。標準的な回答と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のテキスト文字列であるため、二重の円記号と二重引用符\\"も機能します。二重引用符は、単一引用符で囲まれた文字列の例の中にエスケープする必要はありませんので'\"''"'同じJSの文字列の結果。


このソリューションは、SwiftバージョンでJSON POSTの引数に追加される文字列を構築するのに役立ちます。
Nick N

18

バックスラッシュもエスケープしているため、バックスラッシュが表示されています。

二重引用符のほかに、JSONで引用された文字列にバックスラッシュを含める場合は、バックスラッシュもエスケープする必要があります。ただし、エスケープシーケンスでバックスラッシュを使用する場合は、エスケープしないでください。


9

これが最も頻繁に発生するのは、コンテンツが「ダブルエンコード」されている場合です。つまり、エンコードアルゴリズムが誤って2回呼び出された場合です。

最初の呼び出しは "text2"値をエンコードします:

FROM: Heute startet unsere Rundreise "Example text"。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

TO: Heet startet unsere Rundreise \ "Example text \"。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

次に、2番目のエンコーディングで再度変換し、すでにエスケープされた文字をエスケープします。

FROM: Heute startet unsere Rundreise \ "Example text \"。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

TO: Heet startet unsere Rundreise \\\ "Example text \\\"。Jeden Tag wird ein neues Reiseziel angesteuert bis wir。

したがって、ここでサーバーの実装を担当している場合は、同じコンテンツをエンコードしようとする2つのステップがないことを確認してください。


6
私はあなたの第二だと思うので、エンコーダはまた、脱出スイッチを免れるだろうと信じていた:読んでください:。。「Heute startet unsere Rundreise \\\」サンプルテキスト\\\」JedenタグwirdアインノイエスReiseziel angesteuertビスWIR
ジョナサン・ミー

1
@ジョナサンミー:あなたの提案に従って答えを編集しました。理論的には3つのバックスラッシュで正しく記述されていますが、stackoverflowは引用符にもバックスラッシュを使用し、最初の2つのバックスラッシュを1つの単一のバックスラッシュに変換しました
huha

5

JSONで二重引用符をエスケープする場合は、\\を使用してエスケープします。

次のjavascriptオブジェクトの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を安全にする唯一の方法である可能性があることに注意してください。Angularはデフォルトでこの理由でHTML出力を無害化します。
mbokil

100%、データをサニタイズする必要がある場合があることに同意します。XSSもその1つです。指摘していただきありがとうございます。
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.