我想在GSON中创建一个自定义序列化程序,在对象中插入键/值对,而不是新对象。例如,提出这个:
class Car {
@Expose
String model;
@Expose
Manufacturer manufacturer;
}
class Manufacturer {
@Expose
String name;
@Expose
String from;
}
我想得到一个像这样的JSON:
"car":{
"model":"beatle",
"manufacturer":"volkswagen",
"country":"Germany"
}
但无论我如何对序列化器进行编码,它都坚持在“car”中创建一个制造商对象
"manufacturer":{
"name":"volkswagen",
"country":"Germany"
}
如何解决这个问题,只获得键/值对?
PS:我无法在类中进行有意义的更改,因为它们正在映射数据库。这只是模拟我的问题的一个例子。
先谢谢。
答案 0 :(得分:1)
使用自定义序列化程序应该有帮助。
private class ManufacturerSerializer implements JsonSerializer<Manufacturer> {
public JsonElement serialize(Manufacturer src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getName()); // or src.name public.
}
}
请参阅:https://sites.google.com/site/gson/gson-user-guide/#TOC-Custom-Serialization-and-Deserialization
答案 1 :(得分:0)
您应该为Car
类定义自己的serializer和deserializer,这样可以避免以简单的方式序列化合成类,但只会呈现您需要的内容。
这根本不难,例如你将定义
class CarSerializer implements JsonSerializer<Car> {
JsonElement serialize(Car src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject o = new JsonObject();
o.addProperty("manufacturer", src.manufacturer.name);
...
}
}
请记住,您需要按照文档中的说明注册序列化程序。
答案 2 :(得分:0)
我无法用JsonSerializer制作我想要的东西。我只能使用GSON的新API,因为2.1(TypeAdapter类)。
public class ManufacturerSerializer extends TypeAdapter<Manufacturer> {
@Override
public void write(JsonWriter out, Manufacturer m) throws IOException {
out.value(m.getName());
out.name("country");
out.value(m.getFrom());
}
/* I only need Serialization, dont use this */
@Override
public Manufacturer read(JsonReader in) throws IOException {
return null;
}
}