【问题标题】:Java: Gson custom serializer and deserializer special requirementJava:Gson自定义序列化器和反序列化器特殊要求
【发布时间】:2012-12-20 11:10:37
【问题描述】:

我知道如何实现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,但我怀疑是否可以做到。

最优雅的方法是什么?

【问题讨论】:

    标签: json serialization gson


    【解决方案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":"这是a","c":"这是c","d":"这是d"}

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多