4

JsonElementとして返される事前にエスケープされた有効な文字列があるユースケースがあります。ただし、JsonWriterを内部的に使用するJsonElementは、文字列を解析して、文字列のエスケープ/文字置換を試みます。

https://code.google.com/p/google-gson/source/browse/trunk/gson/src/main/java/com/google/gson/stream/JsonWriter.javaを参照してください

private void string()メソッド

String要素は事前にエスケープされているため、パフォーマンス上の理由からこれを避けたいと思います。

検索したところ、このユースケースは類似していることがわかりました: https ://code.google.com/p/google-gson/issues/detail?id = 239

上記のリンクのソリューションはgson1.5で機能しますが、Escaperクラスは最新のgson(2.2.2)で削除されています。

特定のタイプのJsonWriter文字列置換オーバーヘッドを回避できるように、JsonElement(またはその内部のJsonWriter)を拡張するにはどうすればよいですか?

4

1 に答える 1

0

これはうまくいくようです。

OutputStream rawStream = ...
JsonWriter writer = new JsonWriter(new OutputStreamWriter(rawStream, "UTF-8"));

... /* normal gson/json usage */

// about to write object including a base 64 big byte[]
/* don't using binding API for images, too big, too slow */
String b64 = Base64.encodeToString(blob, Base64.NO_WRAP);
writer.beginObject();
writer.flush();
/* gson.JsonWriter doesn't understand the string is b64 encoded,
   and hence doesn't need escaping, so lets use an ASCII encoder
   for a little while
*/
OutputStreamWriter asciiWriter = new OutputStreamWriter(rawStream, "ASCII");
asciiWriter.write(
    String.format("\"id\": \"%d\", \"raw\": \"", param.id)
);
asciiWriter.write(b64);
asciiWriter.write("\" ");
asciiWriter.flush();
writer.endObject();

「API内」ではありませんが、これは引き続き機能するはずです

  • JSONオブジェクトの開始は既知のポイントです(たとえば、{の後に保持する「状態」はありません)
  • 空の JSON オブジェクトを終了することも既知のポイントです ('can just put the 中かっこ })
  • これは、有効な JSON を ascii として書き込んでも、JSON ライターの状態に影響を与える必要がないことを意味します。

これをテストしたところ、動作し、JsonWriter.value(String value) を使用するよりも大幅に高速であることに注意してください。

于 2015-08-27T06:39:03.713 に答える