4

我有一个用例,其中我有一个预先转义的有效字符串作为 JsonElement 返回。但是,内部使用 JsonWriter 的 JsonElement 将解析字符串以尝试进行字符串转义/字符替换。

请参阅https://code.google.com/p/google-gson/source/browse/trunk/gson/src/main/java/com/google/gson/stream/JsonWriter.java

私有 void string() 方法

出于性能原因,我想避免这样做,因为我的 String 元素已预先转义。

我进行了搜索,发现这个用例很相似: https ://code.google.com/p/google-gson/issues/detail?id=239

尽管上述链接中的解决方案适用于 gson1.5,但 Escaper 类已在最新的 gson (2.2.2) 中删除。

如何扩展 JsonElement(或它内部的 JsonWriter),以便避免特定类型的 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 对象也是一个已知点('可以放大括号 })
  • 这反过来意味着同时将有效的 JSON 写入 ascii 不需要影响 JSON 写入器的状态。

请注意,我已经对此进行了测试,它有效,并且比使用 JsonWriter.value(String value) 快得多。

于 2015-08-27T06:39:03.713 回答