使用GSON序列化嵌入对(键/值)而不是对象

时间:2012-07-05 13:00:11

标签: java json gson

我想在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:我无法在类中进行有意义的更改,因为它们正在映射数据库。这只是模拟我的问题的一个例子。

先谢谢。

3 个答案:

答案 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类定义自己的serializerdeserializer,这样可以避免以简单的方式序列化合成类,但只会呈现您需要的内容。

这根本不难,例如你将定义

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;
    }
}