如何使用gson序列化Map <String,List <Integer >>?

时间:2019-10-03 07:21:43

标签: json collections hashmap gson

我遇到了gson的麻烦。 当我调用toJson()方法时,无论我做什么都会抛出StackOverflowError。

这是我正在尝试的代码段。

private Map<String, ArrayList<Integer>> mMap = new HashMap<String, ArrayList<Integer>>() {{
    put("KEY_A", new ArrayList<Integer>( Arrays.asList(1,2,3)));
    put("KEY_B", new ArrayList<Integer>( Arrays.asList(1,3,5)));
    put("KEY_C", new ArrayList<Integer>( Arrays.asList(1,2,3)));
}};
Gson gson = new Gson();
public String getString() {
    return gson.toJson(mMap);
}

我试图在调用toJson()方法时放入类型实参,例如:

Type type = new TypeToken<Map<String, Object>>(){}.getType();
public String getString() {
    return gson.toJson(mMap, type);
}

并尝试了不同类型的配置,例如:

Type type = new TypeToken<Map<String, ArrayList<Integer>>>(){}.getType();
// Object -> ArrayList<Integer>

但根本不起作用。

任何评论将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用GsonBuilder对象启用复杂的映射键序列化。这是一个工作示例:

Map<String, ArrayList<Integer>> mMap = new HashMap<String, ArrayList<Integer>>() {
    {
        put("KEY_A", new ArrayList<Integer>(Arrays.asList(1, 2, 3)));
        put("KEY_B", new ArrayList<Integer>(Arrays.asList(1, 3, 5)));
        put("KEY_C", new ArrayList<Integer>(Arrays.asList(1, 2, 3)));
    }
};
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.enableComplexMapKeySerialization().setPrettyPrinting().create();
Type type = new TypeToken<HashMap<String, ArrayList<Integer>>>(){}.getType();
System.out.println(gson.toJson(mMap, type));

它打印输出:

{
  "KEY_A": [
    1,
    2,
    3
  ],
  "KEY_C": [
    1,
    2,
    3
  ],
  "KEY_B": [
    1,
    3,
    5
  ]
}