如何创建写入原始字符串的GSON自定义序列化程序?

时间:2013-05-15 20:33:51

标签: java json gson

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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

适配器可能如下所示:

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); 

干杯!

答案 1 :(得分:0)

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

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

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

<强> e.g。

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(摘录)

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