我有一个有效负载类,它已经能够将自己写入 JSON 格式的字符串。现在我想返回一个 JSON 对象,其中包含我的有效负载类数组。我正在使用 GSON,并希望创建一个自定义类型适配器,该适配器只需调用 payload.getAsJson() 并将该原始字符串写入 JsonWriter。不幸的是,这对我不起作用,因为字符串被转义了。
有任何想法吗?
适配器可能类似于以下示例:
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);
干杯!
我不确定Gson
@Trinimon 使用的是哪个版本,但正如@FilipFrącz 指出的那样,字符串仍在被转义。
幸运的是,这是一个小问题。在MyTypeAdapter
简单地替换out.value(value.getAsJson());
为out.jsonValue(value.getAsJson());
.
版本: com.google.code.gson:gson:2.6.2
例如
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());
}
}
Gson gson = new GsonBuilder()
.registerTypeAdapter(JsonRaw.class, new JsonRawTypeAdapter())
.create();