【发布时间】:2013-05-15 20:33:51
【问题描述】:
我有一个负载类,它已经能够将自己写入 JSON 格式的字符串。现在我想返回一个 JSON 对象,其中包含我的有效负载类数组。我正在使用 GSON,并希望创建一个自定义类型适配器,它只需调用 payload.getAsJson() 并将该原始字符串写入 JsonWriter。 不幸的是,这对我不起作用,因为字符串被转义了。
有什么想法吗?
【问题讨论】:
我有一个负载类,它已经能够将自己写入 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);
干杯!
【讨论】:
getAsJson() 中使用return "AB\\..{_}[]\"C"; 进行了测试,这是正在生成的字符串:"AB\\..{_}[]\"C";所以没有逃脱。恐怕它甚至不再有用了,尽管实际上非常未转义:)
我不确定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();
【讨论】:
out.jsonValue(value.getAsJson());