2

私はいくつかのオブジェクトを持っています

public class MyObject {
    private String name;
    private String city;
    public MyObject(String n, String c) {
       name=n; city=c;}
    public String getName() {return name;}
    public String getCity() {return city;}
    public void setName(String n) {name=n;}
    public void setCity(String c) {city =c;}
}

そして、私はカスタムシリアライザーを持っています:

public class MySerializer implements JsonSerializer<MyObject> {
public JsonElement serialize(final MyObject myobj, final Type type,      JsonSerializationContext context) {
    JsonObject result = new JsonObject();
    result.add("id", new JsonPrimitive(myobj.getName()));
    return result;
}
}

基本的に、2 つのフィールドのうちの 1 つだけをシリアライズしたいだけです。これは、次のような場合にうまく機能します。

       GsonBuilder builder = new GsonBuilder();
       builder.registerTypeAdapter(MyObject.class, new MySerialize());
       Gson gson = builder.create();
       System.out.println(gson.toJson(new MyObject("test","something"));

ただし、「MyObject」で構成される別のオブジェクトがある場合は、もう少し複雑になります (これが私の質問です)。MyObject の 1 つのフィールドのみをシリアル化する正しいシリアライザーを取得するにはどうすればよいですか。

だから私は別のクラスを持っています:

public class SomeObject {
   private String id;
   private MyObject foo;
   private MyObject bar;
   ...
}

そして私はカスタムシリアライザーを持っています:

  public JsonElement serialize(final SomeObject something, final Type type,            JsonSerializationContext context) {
    JsonObject result = new JsonObject();
    Gson gson = new Gson();
            result.add("id", new JsonPrimitive(something.getId()));

            //here i need help
            result.add("myobject1", new JsonPrimitive(gson.toJson(something.getFoo())));

           return result;
        }

SomeObject のカスタム シリアライザー内で "MyObject" の GsonBuilder を作成するベスト プラクティスかどうかはわかりません。

次のようなことを試しました:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyObject.class, new MySerialize());
builder.registerTypeAdapter(SomeObject.class, new SomeObjectSerializer());
Gson gson = builder.create();
System.out.println(gson.toJson(new SomeObject("id",new MyObject("test","something"),new                   MyObject("test2,"barrrrr"));

そして、私は "{"id":"id","foo"{"id":"test"},"bar":{"id:"test2"}} を実行します

しかし、そうではありません。基本的に、私はセラライザーを持っているカスタムオブジェクトの最初のフィールドだけが欲しいのですが、別のオブジェクトのカスタムシリアライザー内にそのシリアライザーを構築する必要がありますか? 間違っているようですが、理由はわかりません。

4

1 に答える 1

2

JsonSerializationContextカスタムJsonSerializerクラスで にアクセスする方法に注意してください。呼び出すことができJsonSerializationContext#serialize(Object)、Gson は登録済みまたはデフォルトTypeAdapterを使用してそのオブジェクトをシリアル化JsonElementし、outer に追加できる を返しますJsonElement

于 2013-10-10T18:04:27.657 に答える