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