1

私は JsonDeserializer と JsonSerializer を実装する方法を知っていますが、私がやりたいことは次のとおりです。

これはセットアップです:

public class classA
{
public String a;
public classB clazzB;
}

public class classB
{
public String c;
public String d;
public String e;
public String f;
}

次のようにclassAをシリアル化(およびこれにアナログを逆シリアル化)したい:

  • classA をシリアル化するときは、classB の一部もシリアル化する必要があります。たとえば、変数 c と d を指定します。

私はそれを行う方法を知っているので(eとfにトランジェントを使用)、ここにキャッチがあります:

  • c と d (classA でシリアル化する必要がある classB の部分) は JSONObject に含めるべきではなく、classA の変数を使用して INLINE で表示する必要があります

本質的に、結果は次のようになります。

{"a":"something","c":"something", "d":"something"}

ここで JsonSerializer で抱えている問題は、classB からシリアル化する必要がある 2 つの変数 (それ以上の可能性もあります) があることです。1 つしかない場合は、変数の JSONPrimitive を返すことができます。serialize メソッドで JsonTreeWriter を使用することを考えていましたが、それができるとは思えません。

これを行う最もエレガントな方法は何ですか?

4

1 に答える 1

1

基本的にオブジェクトを実際のJSONに相当するものにシリアライズしたくないと言っているので、「あなたは間違っています」以外...シリアライズしませんclassB。それはあなたが望むものではないからです。2 つのオブジェクトのフィールドを持つ単一の JSON オブジェクトが必要です。

A のカスタム デシリアライザーとシリアライザーを作成し、作成しようとしている JSON を作成するだけです。

class ClassA
{
    public String a = "This is a";
    public ClassB clazzB = new ClassB();
}

class ClassB
{
    public String c = "This is c";
    public String d = "This is d";
    public String e;
    public String f;
}


class ASerializer implements JsonSerializer<ClassA>
{

    public JsonElement serialize(ClassA t, Type type, JsonSerializationContext jsc)
    {
        JsonObject jo = new JsonObject();
        jo.addProperty("a", t.a);
        jo.addProperty("c", t.clazzB.c);
        jo.addProperty("d", t.clazzB.d);
        return jo;
    }

}

public class Test 
{
    pubic static void main(String[] args) 
    { 
        GsonBuilder gson = new GsonBuilder();
        gson.registerTypeAdapter(ClassA.class, new ASerializer());
        String json = gson.create().toJson(new ClassA());
        System.out.println(json);
    }
}

出力:

{"a":"これは a","c":"これは c","d":"これは d"}

ClassBまた、そのシリアライザーでシリアライズし、要素を追加してClassA返すというルートをたどることもできます。

于 2012-12-21T18:34:42.710 に答える