1

新しいオブジェクトではなく、オブジェクトにキーと値のペアを挿入するカスタム シリアライザーを 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"
}

しかし、シリアライザーをどのようにコーディングしても、「車」内に製造元オブジェクトを作成することを主張します

"manufacturer":{
    "name":"volkswagen",
    "country":"Germany"
}

キーと値のペアのみを取得するには、どうすれば修正できますか?

PS: クラスは DB をマッピングしているため、クラスに大幅な変更を加えることはできません。私の問題をシミュレートするのは単なる例です。

ありがとうございます。

4

3 に答える 3

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

于 2012-07-05T13:07:16.693 に答える
0

JsonSerializer で思い通りのものが作れませんでした。2.1以降のGSONの新しいAPI(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;
    }
}
于 2012-07-13T18:37:36.623 に答える
0

クラスに対して独自のシリアライザーとデシリアライザーを定義する必要があります。これにより、合成されたクラスを単純な方法でシリアル化することは避けられますが、必要なものだけがレンダリングされます。Car

それはまったく難しいことではありません。たとえば、次のように定義します

class CarSerializer implements JsonSerializer<Car> {
  JsonElement serialize(Car src, Type typeOfSrc, JsonSerializationContext context) {
    JsonObject o = new JsonObject();
    o.addProperty("manufacturer", src.manufacturer.name);
    ...
  }
}

ドキュメントで説明されているように、シリアライザーを登録する必要があることに注意してください。

于 2012-07-05T13:07:27.863 に答える