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

os8fio9y  于 2023-01-14  发布在  其他
关注(0)|答案(3)|浏览(102)

我想在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"
}

我该如何解决这个问题,只获取键/值对?
我不能对类做有意义的修改,因为它们Map了数据库。这只是一个模拟我的问题的例子。

f87krz0w

f87krz0w1#

使用自定义序列化程序应该会有所帮助。

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

7y4bm7vi

7y4bm7vi2#

您应该为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);
    ...
  }
}

请记住,您需要按照文档中的说明注册序列化程序。

11dmarpk

11dmarpk3#

我不可能用JsonSerializer做我想做的。我只能用GSON 2.1(TypeAdapter类)以来的新API让它正常工作。

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

相关问题