JSON-lib を使用する場合、JSONを含む文字列をエスケープされた文字列としてではなく JSON として格納することをメソッドがJSONObject
停止するにはどうすればよいですか?put
例えば:
JSONObject obj = new JSONObject();
obj.put("jsonStringValue","{\"hello\":\"world\"}");
obj.put("naturalStringValue", "\"hello world\"");
System.out.println(obj.toString());
System.out.println(obj.getString("jsonStringValue"));
System.out.println(obj.getString("naturalStringValue"));
プリント:
{"jsonStringValue":{"hello":"world"},"naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
そして私はそれを印刷したい:
{"jsonStringValue":"{\"hello\":\"world\"}","naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
はい、私はこれが不快であることを認識しています。ただし、これは JSON シリアライゼーション パイプラインをサポートするためのものであり、相互運用性のために、これは予期される動作です。有効な JSON である/含まれている可能性のあるユーザー入力をシリアル化する場合があります。ユーザー入力が、その入力をシリアル化する JSON オブジェクトの一部になることは望ましくありません。
\
JSON-lib が文字をエスケープするため、手動エスケープは機能しません。
JSONObject obj = new JSONObject();
obj.put("naturalJSONValue","{\"hello\":\"world\"}");
obj.put("escapedJSONValue", "{\\\"hello\\\":\\\"world\\\"}");
System.out.println(obj.toString());
System.out.println(obj.getString("naturalJSONValue"));
System.out.println(obj.getString("escapedJSONValue"));
出力:
{"naturalJSONValue":{"hello":"world"},"escapedJSONValue":"{\\\"hello\\\":\\\"world\\\"}"}
{"hello":"world"}
{\"hello\":\"world\"}
この時点で、複雑な JSON オブジェクトを手動で選択的にエスケープできるようにする回避策は、そもそも JSON-lib を使用する価値を完全に無効にします。
また、以前にもこの質問があったことは承知しておりますが、残念ながらその回答を簡単に受け入れることはできません。JSON-lib は私のプロジェクトの多くの領域で頻繁に使用される依存関係であり、それを交換することは大きな仕事になるでしょう。Jackson、simple-json、または Gson へのスワップを楽しむ前に、JSON-lib でこの目標を達成する方法がないことを完全に確認する必要があります。