248

これが私の文字列です

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

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

4

10 に答える 10

419

基本的なトピックについて、これほど多くの意見が寄せられている質問に対して、非常に多くの支持を得ている誤った情報が存在することに、私は愕然としています。

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 にエンコードします。JSON.stringifyこのような関数は、JavaScript 、PHP json_encode、Python など、使用している言語に組み込まれている可能性があります。json.dumps. このような機能が組み込まれていない言語を使用している場合は、JSON の解析およびエンコード ライブラリを使用できるはずです。JSON との間の変換に言語またはライブラリ関数を使用するだけであれば、JSON のエスケープ規則を知る必要さえありません。これは、ここで見当違いの質問者がすべきことです。

于 2014-12-17T01:21:29.647 に答える
42

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

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

于 2014-09-11T21:25:55.983 に答える
6

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

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 によっても提案されました。すばらしい答え BTW

これが誰かに役立つことを願っています。

于 2016-03-08T12:37:17.733 に答える
-2

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

例えば。:

var product_list = encodeURIComponent(JSON.stringify(product_list));

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

于 2019-04-29T10:26:21.290 に答える