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 个变量(可能更多)。如果它只有一个,那么我可以只返回变量的 JSONPrimitive。我正在考虑在序列化方法中使用 JsonTreeWriter,但我怀疑这可以做到。

最优雅的方法是什么?

4

1 回答 1

1

除了“你做错了”,因为你基本上是在说你不想将你的 Objects 序列化为实际的 JSON 等价物......你不要 serialize classB,因为那不是你想要的。您需要一个 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 回答