java - Gson 2.2.2 Json 为 JsonElement 自定义 JsonWriter 以避免转义字符串?

标签 java json gson

我有一个用例,其中我有一个预转义的有效字符串作为 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) 中删除。

我如何扩展 JsonElement(或其内部的 JsonWriter),从而避免特定类型的 JsonWriter 字符串替换开销?

最佳答案

这似乎可行。

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) 快得多。

关于java - Gson 2.2.2 Json 为 JsonElement 自定义 JsonWriter 以避免转义字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15486137/

相关文章:

java - 如何使用 GSON 检查 JSON 在 Java 中是否有效?

java - 在方法引用的返回值上调用方法

php - 从 error_handler 访问变量

xml - SSAS 多维数据集的 JSON 结果

java - 评估匿名类的 toString() 时出现 NullPointerException

java - 解析一个像这样的 JSON 日期 :/Date(-62135596800000)/

java - Gson反序列化json,其中包含可以是字符串或对象的参数

java - 多列上的 DISTINCT 查询不起作用 - Google App Engine 数据存储区

java - Spring JDBCTemplate 执行不抛出异常

java - DocuSign REST API : How can I configure the ttl_expired timeout for a Recipient URL