Java:Gson自定义序列化器和解串器的特殊要求

时间:2012-12-20 11:10:38

标签: json serialization gson

我知道如何实现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中遇到的问题是有2个变量(可能更多)我必须从classB序列化。如果只有一个那么我就可以返回变量的JSONPrimitive。我正在考虑在序列化方法中使用JsonTreeWriter,但我怀疑是否可以这样做。

最优雅的方法是什么?

1 个答案:

答案 0 :(得分:1)

除了“你做错了”,因为你基本上说你不想将你的对象序列化为实际的JSON等价物......你没有序列化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”:“这是”,“c”:“这是c”,“d”:“这是d”}

您还可以在该序列化程序中对ClassB进行序列化,添加ClassA中的元素并返回该元素。