JSON文字列を構築するときに特殊文字をエスケープするにはどうすればいいですか? 質問する

JSON文字列を構築するときに特殊文字をエスケープするにはどうすればいいですか? 質問する

これが私の文字列です

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

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

ベストアンサー1

基本的なトピックに関する非常によく閲覧されている質問に、高い評価を得ている誤情報が存在することに私は愕然としています。

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

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

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

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

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u4桁の16進数が続く

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

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

おすすめ記事