Gson可以处理内联初始化的列表

时间:2015-12-11 17:47:37

标签: java json gson

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处理内联初始化列表?

2 个答案:

答案 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());
}