我为包含enum属性的类写了一个TypeAdapter
。这是write
方法,它使用标准GSON序列化作为枚举值:
@Override
public void write(JsonWriter writer, MyClass object) throws IOException {
if (object == null) {
writer.nullValue();
return;
}
writer.beginObject();
writer.name("type").value(gson.toJson(object.getType())); //this is the enum
writer.endObject();
}
使用此TypeAdapter
时,生成的JSON包含枚举的此部分:
"type":"\"ENUM_VALUE\""
但是当我在没有TypeAdapter的包含此枚举的类上使用gson.toJson(object)
时,它会生成:
"type":"ENUM_VALUE"
所有Gson
个对象都使用标准配置。它在第一个版本中产生相同的结果,无论是直接测试TypeAdapter
还是使用Gson
并注册它。
为什么会有区别?我想这里不需要逃避,所以我想避免它。
有趣的是,反序列化适用于TypeAdapter
(带gson.fromJson(reader.nextString())
)的序列化版本。
我想问题可能会发生,因为gson.toJson(object.getType())
已经生成了引号:"ENUM_VALUE"
,并且在JsonWriter
添加writer.value(gson.toJson(object.getType())
时它会被转义。但是如何正确处理这个问题,就像GSON一样呢?
答案 0 :(得分:1)
只是你的TypeAdapter
错了。替换为:
public void write(JsonWriter writer, MyClass object) throws IOException {
if (object == null) {
writer.nullValue();
return;
}
writer.beginObject();
writer.name("type").value(object.getType().toString()); //this is the enum
writer.endObject();
}
在您的代码中,您从执行JSON序列化的枚举中创建一个字符串。这会生成"ENUM_VALUE"
(gson.toJson(object.getType())
),然后将其再次序列化为字符串,结果为\"ENUM_VALUE\"
。
在我的代码中,我使用toString()
方法获取枚举的字符串表示,因此不会创建其他引号。