JSON文字列の作成時に特殊文字をエスケープする方法は?


200

これが私のひもです

{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}    

ここでは、メッセージに単一引用符が含まれています。これは、JSONで使用される引用符と同じです。メッセージなどのユーザー入力から文字列を入力します。したがって、コードを壊すような特殊なシナリオを回避する必要があります。しかし、文字列の置換以外に、それらをエスケープする方法はありますが、HTMLでそれらを処理して正しいメッセージに戻すことはできますか?


45
JSONは二重引用符のみを使用し、単一引用符は使用しません。json.orgを
Niels Bom

4
RFC 4627では、パーサーは準拠JSON(段落4)を解析できなければならず、JSON以外の追加の拡張機能をサポートしている可能性があると述べています。ただし、パラグラフ5では、すべてのプロデューサー(ジェネレーター)が100%準拠のJSONのみを生成する必要があると強調しています。エスケープする必要のないフレーム文字を使用してJSONを生成することは、特に悪い考えです。アポストロフィを引用符に置き換えることを検討してください。ietf.org/rfc/rfc4627.txt
Luv2code

3
@ Luv2codeあなたがしている点は真実のままですが、あなたは時代遅れの仕様を引用していることに注意してください。RFCを読むときは、テキストバージョンではなく、常にtools.ietf.org/htmlバージョンを使用してください。HTMLバージョンの方が読みやすく、サブセクションへのリンクが簡単です。最も重要なのは、HTMLバージョンの上部に、読んでいるものを更新または廃止する後続のすべてのRFCのリストです。あなたがに行ってたい場合tools.ietf.org/html/rfc4627あなたはRFC 4627が廃止され、置き換えられていることを見てきたと思いRFC 7159
Mark Amery

3
将来的にはこれを読む人のために、RFC 7159は、順番に現在使用されていませんtools.ietf.org/html/rfc8259
ヨラムバンをBoezemデン

回答:


286

仕様に従って、JSON文字列は二重引用符で囲む必要があるため、エスケープする必要はありません'
JSON文字列で特殊文字を使用する必要がある場合は、次を使用してエスケープできます\

JSONで使用される特殊文字のリストをご覧ください。

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\"  Double quote
\\  Backslash character


ただし、仕様に完全に反している場合でも、作成者は \'

これは悪い理由です:

  • 仕様に反しています
  • それはもはやJSONの有効な文字列ではありません

しかし、あなたが望むかどうかにかかわらず、それは機能します。

新しいリーダーの場合、json文字列には常に二重引用符を使用してください。


30
"単一引用符で囲まれたjson文字列"?これはナンセンスです; JSONの文字列は、二重引用符でしか囲まれません。JSON.parse("'foo'")たとえば、ブラウザコンソールで試してみてくださいSyntaxError: Unexpected token '。JSON仕様は非常にシンプルで、これについては明確です。JSONには単一引用符のエスケープシーケンスはなく、JSON文字列を単一引用符で囲むことはできません。
Mark Amery 2014

15
この回答に対する明確な更新と思われるものでさえ、悪いことです。技術的には真実ですが、エスケープする必要がないと言うのは誤解を招きやすく、'技術的には真実ですが、合法的に子供を殺害する必要はないという誤解を招きます。より正確には、あなた逃げることができないと言うことでしょう'\'は不正なエスケープシーケンスです。使用すると、JSONは有効なJSONでなくなり、JSONパーサーによってチョークされます。(確かにJavaScript JSON.parseとPython json.loadsはそうします。)
Mark Amery

2
この答えは、多くの編集を行った後もまったくナンセンスのままです。JSONで一重引用符で囲まれた文字列を使用し、\'エスケープシーケンスを使用すると、「必要に応じて機能すると誤って主張します。これは誤りです。一重引用符で囲まれた文字列やシーケンスを詰まらせない、 JSONパーサーを一般的に使用することを提案し\'ます。すでに指摘し たとおりJSON.parse("'foo'")JSON.parse('"\\\'"')(JavaScriptの場合)json.loads("'foo'")およびjson.loads('"\\\'"')(Pythonの場合)はどちらも例外をスローします。これらの構成を使用すると「機能する」という主張の根拠は何ですか?
Mark Amery、2015

10
@ Luv2code興味深い引用。あなたはそれを少し誤解しています。バックスラッシュを前に置くだけでエスケープできるという意味ではありません。より完全な引用は、「すべての文字がエスケープされる可能性があります。文字が基本多言語面(U + 0000からU + FFFF)にある場合、6文字のシーケンスとして表される場合があります。...または、2つある- 文字シーケンスは、いくつかの人気のある文字の表現をエスケープします。あなたが逃げることができると言っています'よう\u0027ないあなたのようにそれを逃れることができるという\'
マークアメリー2015

2
それでも、@ Luv2codeは、「あなたは逃げられない'」という(そしてそのような行為を子供の殺害と比較する!)と述べた私の反対意見が技術的に間違っていることを意味します。より正確なのは、それだけではなく、それをエスケープできると言うことです\'。私は、仕様のRFCバージョンがシーケンス\u0027を、それらが表す文字を「エスケープ」する方法として参照していることを理解していませんでした。\'しかし、違法である重要な点は依然として真実かつ重要です。
マークアメリー2015

362

基本的なトピックに関するこのような非常によく見られる質問について、非常に支持された誤った情報の存在に私はぞっとさせられます。

JSON文字列を単一引用符で囲むことはできません。仕様のさまざまなバージョン(Douglas Crockfordによるオリジナル、ECMAバージョン、およびIETFバージョン))はすべて、文字列は二重引用符で囲む必要があると述べています。これは理論的な問題ではなく、受け入れられた回答が現在示唆しているような意見の問題でもありません。実際のJSONパーサーは、単一引用符で囲まれた文字列を解析しようとするとエラーになります。

CrockfordとECMAのバージョンは、きれいな絵を使用して文字列の定義を表示することもできます。これにより、ポイントが明確になります。

JSON仕様の文字列の定義を示す画像

きれいな画像には、JSON文字列内の正当なエスケープシーケンスもすべてリストされています。

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 4桁の16進数

ここで他のいくつかの答えのナンセンスに反して、 \' JSON文字列では有効なエスケープシーケンスになることはありません。JSON文字列は常に二重引用符で囲まれているため、そうである必要はありません。

最後に、プログラムで JSONを生成するときは、通常、自分で文字をエスケープすることを考える必要はありません(もちろん、JSONベースの構成ファイルを手動で編集するときなどです)。代わりに、言語が持つネイティブマップ、配列、文​​字列、数値、ブール値、およびnull型を使用してエンコードするデータ構造を形成し、JSONエンコード関数を使用してJSONにエンコードします。このような関数は、JavaScript JSON.stringify、PHP json_encode、Pythonなど、使用している言語に組み込まれている可能性があります。json.dumps。このような機能が組み込まれていない言語を使用している場合は、使用するJSON解析およびエンコードライブラリを見つけることができます。言語関数やライブラリ関数を使用して物事をJSONに、またはJSONから変換するだけの場合は、JSONのエスケープルールを知る必要さえありません。これは、ここで誤解を招く質問者がするべきであったことです。


4 hex バイトまたはニブル
leetbacoon、

36

引用符で囲まれた文字列リテラルでエスケープ'する方法について誰もが話している'。ここにははるかに大きな問題があります。単一引用符で囲まれた文字列リテラルは有効なJSONではありません。JSONはJavaScriptに基づいていますが、同じではありません。JavaScriptコード内でオブジェクトリテラルを記述している場合は、問題ありません。実際にJSONが必要な場合は、を使用する必要があります"

二重引用符で囲まれた文字列では、をエスケープする必要はありません'。("文字列にリテラルが必要な場合は、を使用します\"。)


1
こんにちは、二重引用符で囲まれた文字列で、エスケープする必要はありません'。文字列値がの場合の例は"Member's_id" : 4、エスケープする必要がないと言っていますか?どうやら私はそれが間違ったエンコーディングのエラーを与える問題を抱えています:UTF-8そしてそれはとして読み取られていMember�sます。その手動で生成されたjsonファイル。
Shubham

1
'JSON文字列リテラルではエスケープしないでください。どこかからコピー&ペーストしましたか?たぶんそれは実際には\u2019アポストロフィではありません。私の推測では、誰かがそれをMS Wordに入力し、それが最もよく知っていると思うので、それを引用符に変えました。文法的には、古き良きASCII文字のアポストロフィ('、別名\x27、これまでは「単一引用符」と呼んでいた)が必要なものです。ただし、他の同様の問題がある場合に備えて、文字エンコードの問題を修正するとよいでしょう。したがって、文字エンコーディングを選択し、それを読み取りと書き込みの両方に使用します。または、を使用してエスケープし\uます。
David Knipe

7

これらの回答のほとんどは、質問に回答しないか、説明が不必要に長くなっています。

OKなので、JSONは二重引用符のみを使用します。

私はJQuery AJAXを使用してJSONデータをサーバーに投稿し、後で同じ情報を返そうとしました。私が見つけた投稿された質問に対する最良の解決策は、使用することでした:

var d = {
    name: 'whatever',
    address: 'whatever',
    DOB: '01/01/2001'
}
$.ajax({
    type: "POST",
    url: 'some/url',
    dataType: 'json',
    data: JSON.stringify(d),
    ...
}

これはあなたのために文字をエスケープします。

これはMark Ameryによっても提案されました。

これが誰かを助けることを願っています。


0

私はパーティーには遅すぎるかもしれませんが、これは単一引用符を解析/エスケープします(解析とエスケープの戦いに入りたくありません)。

JSON.parse("\"'\"")

0

直接的な質問の答え:
安全のために、必要な文字を\ u + 4-digit-hex-valueに置き換えます

例:アポストロフィをエスケープする場合は、「\ u0027に置き換えます
D'AmicoをD \ u0027Amicoに

良い参照:http : //es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes


参照の場合は-1。質問はJSONに関するものですが、リンクされた参照はJavaScriptに関するものであり、のようなJavaScriptでは無効なエスケープシーケンスをリストします\'
マークアメリー2018

ありがとうマーク-私は本当に別の角度を与えたかっただけです-誰がここに到着するかに応じて、これが役立つと思うかもしれません。しかし、私はJSONとJavascriptについてあなたの意見を述べます-フォーラムの忍者であることに感謝します。
Luigi D'Amico、

0

文字列をエンコードするには、encodeURIComponent()を使用します。

例えば。var product_list = encodeURIComponent(JSON.stringify(product_list));

Webサーバーが自動的に同じ処理を行うため、デコードする必要はありません。


0

テンプレートリテラルを使用しています...

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;

-2

一重引用符で囲まれたjsonは実際のjsonではないことに私たちは皆同意していると思います。それでも、ライブラリーがないため、二重引用符で囲まれたjson文字列内でエスケープする問題に対処する必要があります。

各 "を\"で置き換えることは十分ではありません:ユーザーは入力:\を入力することができ、解析は再び失敗します(理由を考えてください)。

代わりに、最初に各\を\(二重のバックスラッシュ)に置き換えます。次に、各 "を\"(バックスラッシュの後に ")に置き換えます。


-2

jsonの目的で二重引用符で囲まれた文字列内の単一引用符を許可するには、単一引用符を二重にします。{"X": "質問とは"} ==> {"X": "質問とは"}

/codereview/69266/json-conversion-to-single-quotes

\ 'シーケンスが無効です。


2
JSON文字列で単一引用符を2倍にしても、エスケープされません。これは、文字列に1つではなく2つの一重引用符が含まれていることを意味します。
Mark Amery

-15

AlexBの投稿について:

 \'  Apostrophe or single quote
 \"  Double quote

単一引用符のエスケープは、単一引用符で囲まれたjson文字列
でのみ有効です二重引用符のエスケープは、二重引用符で囲まれたjson文字列でのみ有効です

例:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid

14
JSONでは、単一引用符で囲まれた文字列は無効です。JSONはJavaScriptではありません。JSONでは、単一引用符をエスケープすることはできません。JSON構文の非常に単純なドキュメントについては、json.orgを参照してください。
srm 2014年

3
反対票-一重引用符のjsonが無効であるため!
DominikAngerer

jsonでは一重引用符は無効です。これが可能である場合は、実用的なサンプルを提示してください
Rohith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.