Gson无法处理内联初始化的列表,如下所示:
@Test
public void cannot_serialize(){
List<String> items = new ArrayList(){{
add("a");
add("s");
}};
Gson gson = new Gson();
String json = gson.toJson(items);
System.out.println(json);
System.out.println(items.getClass());
}
@Test
public void cannot_serialize_with_cast(){
List<String> items = (ArrayList<String>)new ArrayList(){{
add("a");
add("s");
}};
Gson gson = new Gson();
String json = gson.toJson(items);
System.out.println(json);
System.out.println(items.getClass());
}
这两个测试的输出在这里:
null
class tests.tradio.GsonTests$1
null
class tests.tradio.GsonTests$2
我猜混乱的类类型会导致Gson忽略该列表。当然,没有内联初始化一切正常:
@Test
public void serializes(){
List<String> items = new ArrayList<>();
items.add("a");
items.add("s");
Gson gson = new Gson();
String json = gson.toJson(items);
System.out.println(json);
System.out.println(items.getClass());
}
["a","s"]
class java.util.ArrayList
有没有办法让Gson处理内联初始化列表?
答案 0 :(得分:3)
此
List<String> items = new ArrayList(){{
add("a");
add("s");
}};
是ArrayList
的匿名子类。
Gson
, by default, excludes anonymous classes from being serialized.这是在Excluder
内确定的,如果您对它的作用感兴趣的话。
如果你愿意的话,你可以和杰克逊一起做。
List<String> items = new ArrayList() {
{
add("a");
add("s");
}
};
ObjectMapper gson = new ObjectMapper();
String json = gson.writeValueAsString(items);
System.out.println(json);
但老实说,不要使用这些“黑客”来创建ArrayList
对象或其他集合类型。
答案 1 :(得分:0)
似乎Gson无法识别类类型,这就是为什么它打印为null。 hack 将把这个列表包装到另一个列表中,如下所示:
public static void main(String[] args) {
List<String> items = new ArrayList<String>(new ArrayList<String>(){{
add("a");
add("s");
}});
Gson gson = new Gson();
String json = gson.toJson(items);
System.out.println(json);
System.out.println(items.getClass());
}