3

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

有任何想法吗?

4

2 回答 2

4

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

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

干杯!

于 2013-05-15T20:48:27.100 回答
1

我不确定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(片段)

Gson gson = new GsonBuilder()
        .registerTypeAdapter(JsonRaw.class, new JsonRawTypeAdapter())
        .create();
于 2016-06-21T04:52:45.037 回答