【问题标题】:How to create GSON custom serializer that writes raw string?如何创建写入原始字符串的 GSON 自定义序列化程序?
【发布时间】:2013-05-15 20:33:51
【问题描述】:

我有一个负载类,它已经能够将自己写入 JSON 格式的字符串。现在我想返回一个 JSON 对象,其中包含我的有效负载类数组。我正在使用 GSON,并希望创建一个自定义类型适配器,它只需调用 payload.getAsJson() 并将该原始字符串写入 JsonWriter。 不幸的是,这对我不起作用,因为字符串被转义了。

有什么想法吗?

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    适配器可能类似于以下示例:

    public class MyTypeAdapter extends TypeAdapter<MyPayload> {
    
      // Just added this as a sample assuming you have a constructor that 
      // builds a Payload instance from a String
      public MyPayload read(JsonReader reader) throws IOException {
        if (reader.peek() == JsonToken.NULL) {
          reader.nextNull();
          return null;
        }
    
        String json = reader.nextString();
        return new MyPayload(json);
      }
    
      // use value.getAsJson() for conversion
      public void write(JsonWriter writer, MyPayload value) throws IOException {
        if (value == null) {
          writer.nullValue();
          return;
        }
    
        String json = value.getAsJson();
        writer.value(json);
      }
    } 
    

    假设您有适当的构造函数,它将 Json String 转换为 Payload 实例,反之亦然。如果不需要,只需在方法体中返回null

    这就是你如何使用它:

    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(MyPayload.class, new MyTypeAdapter());
    Gson gson = builder.create();
    
    String jsonString = gson.toJson(somethingThatContainsMyPayloads); 
    

    干杯!

    【讨论】:

    • 感谢回答,但恐怕 writer.value(String) 方法实际上会转义字符串...
    • 好吧,我在getAsJson() 中使用return "AB\\..{_}[]\"C"; 进行了测试,这是正在生成的字符串:"AB\\..{_}[]\"C";所以没有逃脱。恐怕它甚至不再有用了,尽管实际上非常未转义:)
    【解决方案2】:

    我不确定Gson @Trinimon 使用的是哪个版本,但正如@FilipFrącz 指出的那样,字符串仍在被转义。

    幸运的是,这是一个小问题;在MyTypeAdapter 中,只需将out.value(value.getAsJson()); 替换为out.jsonValue(value.getAsJson());

    版本: com.google.code.gson:gson:2.6.2

    例如

    JsonRawTypeAdapter.java

    public class JsonRawTypeAdapter extends TypeAdapter<JsonRaw> {
    
        @Override
        public JsonRaw read(JsonReader in) throws IOException {
            if (in.peek() == JsonToken.NULL) {
                in.nextNull();
                return null;
            }
            return new JsonRaw(in.nextString());
        }
    
        @Override
        public void write(JsonWriter out, JsonRaw value) throws IOException {
            if (value == null) {
                out.nullValue();
                return;
            }
            out.jsonValue(value.getAsJson());
        }
    
    }
    

    WebMvcConfig.java (sn-p)

    Gson gson = new GsonBuilder()
            .registerTypeAdapter(JsonRaw.class, new JsonRawTypeAdapter())
            .create();
    

    【讨论】:

    • @FilipFrącz - 只需使用out.jsonValue(value.getAsJson());
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2013-05-04
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多