8

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 でこの目標を達成する方法がないことを完全に確認する必要があります。

4

2 に答える 2

5

これはjson-lib 2.4でうまくいきました:

System.out.println(
    new JSONStringer()
        .object()
            .key("jsonStringValue")
                .value("{\"hello\":\"world\"}")
            .key("naturalStringValue")
                .value("\"hello world\"")
        .endObject()
    .toString());

出力は次のとおりです。

{"jsonStringValue":"{\"hello\":\"world\"}","naturalStringValue":"\"hello world\""}
于 2011-05-30T03:41:09.393 に答える
1

文字列を引用するには、一重引用符を使用します。ドキュメントから:

文字列は ' (シングル クォーテーション) で囲むことができます。

文字列が引用符または一重引用符で始まらない場合、先頭または末尾にスペースが含まれていない場合、および次の文字が含まれていない場合は、文字列を引用符で囲む必要はまったくありません: { } [ ] / \ : , = ; # 数字のように見えず、予約語の true、false、または null でない場合。

したがって、例を変更します:

net.sf.json.JSONObject obj = new net.sf.json.JSONObject();
obj.put("jsonStringValue","{\"hello\":\"world\"}");
obj.put("quotedJsonStringValue","\'{\"hello\":\"world\"}\'");
obj.put("naturalStringValue", "\"hello world\"");
System.out.println(obj.toString());
System.out.println(obj.getString("jsonStringValue"));
System.out.println(obj.getString("quotedJsonStringValue"));
System.out.println(obj.getString("naturalStringValue"));

プロデュース:

{"jsonStringValue":{"hello":"world"},"quotedJsonStringValue":"{\"hello\":\"world\"}","naturalStringValue":"\"hello world\""}
{"hello":"world"}
{"hello":"world"}
"hello world"

quotedJsonStringValueJSON ではなく文字列値として扱われ、出力 JSON で引用符で囲まれていることに注意してください。

于 2011-06-03T15:14:22.963 に答える