当前位置: 首页 > 面试题库 >

使用自定义序列化使用Gson序列化枚举映射

长孙深
2023-03-14
问题内容

遵循在使用GSON解析JSON时使用枚举中的建议,我正在尝试序列化其键是enum使用Gson
的映射。

考虑以下类别:

public class Main {

    public enum Enum { @SerializedName("bar") foo }

    private static Gson gson = new Gson();

    private static void printSerialized(Object o) {
        System.out.println(gson.toJson(o));
    }

    public static void main(String[] args) {
        printSerialized(Enum.foo); // prints "bar"

        List<Enum> list = Arrays.asList(Enum.foo);
        printSerialized(list);    // prints ["bar"]

        Map<Enum, Boolean> map = new HashMap<>();
        map.put(Enum.foo, true);
        printSerialized(map);    // prints {"foo":true}
    }
}

两个问题:

  1. 为什么printSerialized(map)打印{"foo":true}而不是{"bar":true}
  2. 我该如何打印{"bar":true}

问题答案:

Gson对Map密钥使用了专用的序列化器。默认情况下,它使用将toString()要用作键的对象的。对于enum类型,基本上就是enum常量的名称。@SerializedName,默认为enum类型,仅当将序列化为enumJSON值(对名称除外)时才使用。

使用GsonBuilder#enableComplexMapKeySerialization来构建你的Gson实例。

private static Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();


 类似资料:
  • 问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。

  • 如何用gson 2.2.4序列化和反序列化像这样的简单枚举?

  • 我需要序列化/反序列化特定枚举: 我有个例外: 我如何通过GSON序列化/反序列化它?

  • 问题内容: 我有一个下面的枚举: 我用控制器()返回枚举数组,Spring将其序列化为以下json字符串: 强迫Jackson像POJO一样序列化枚举的最佳方法是什么?例如: 我使用了不同的注释,但无法获得这样的结果。 问题答案: 终于我找到了解决方案。 我必须用注释枚举并实现自定义序列化程序:

  • 问题内容: 我在使用Gson解析JSON响应时遇到问题。 JSON字串: 我有这两个课程: 但是当使用Gson解析这个时我有一个异常。我知道这是因为响应数组的第一个元素不是对象,而是整数。 所以问题是,我能以某种方式解决它吗? 问题答案: 您必须编写一个 自定义反序列化器 。我会做这样的事情: 首先,您需要包括一个新的类,而不是已有的两个类: 然后,您需要一个自定义解串器,类似于以下内容: 然后,

  • 我有一个不能用Gson正确序列化的类(类只是name和HashMap),所以我编写了一个自定义序列化程序来从HashMap中打印名称和键值对。 此外,这是实际打印的内容,序列化整个对象并不像我所期望的那样工作,也不只是直接打印对象。 任何帮助都将不胜感激。