我去看了医生,因为我走路的时候脚疼。医生说:“别踩它。”
一般来说,当使用像 Gson 这样的 API 时,人们宁愿不知道 JsonArray 的存在,而是只使用 API 的数据绑定部分。因此,与其手动构建JsonArray,然后对其进行序列化处理,只需将Java List 或数组提供给Gson.toJson()。例如:
List list = new ArrayList();
list.add("one");
list.add(2);
list.add(new Foo());
Gson gson = new Gson();
String json = gson.toJson(list);
System.out.println(json);
如果该方法不符合您的需求,并且由于某种原因您无法使用JsonArray,那么您可能会想只调用它的toString() 方法,因为这确实创建了最终所需的方法,我不会使用它,因为文档中没有任何内容说 toString() 保证创建封闭数组内容的有效 JSON 表示。因此,在 Gson 的未来版本中,它可能不会返回相同格式的 String。
无论如何,如果你真的想使用 JsonArray,它应该足够好地序列化,如下所示。
JsonElement one = new JsonPrimitive("one");
JsonElement two = new JsonPrimitive(2);
JsonObject foo = new JsonObject();
foo.addProperty("foo", new Foo().foo);
JsonArray jsonArray = new JsonArray();
jsonArray.add(one);
jsonArray.add(two);
jsonArray.add(foo);
System.out.println(new Gson().toJson(jsonArray));
// ["one",2,{"foo":"hi"}]
注意:此答案基于 Gson 2.2 API。我不记得早期版本的 Gson 是否包含重载的 toJson(JsonElement) 方法。
如果toJson 方法已经以这种方式使用(序列化JsonArray),但输出如原始问题中所示,请记住,Java 在选择重载时不会考虑运行时类型方法。它绑定到编译时类型。 (蹩脚——我知道。)因此,您可能需要将参数类型转换为JsonElement,以让编译器知道要绑定到哪个方法。以下演示了原始问题中可能有效发生的情况。
System.out.println(new Gson().toJson((Object)jsonArray));
// {"elements":["one",2,{"foo":"hi"}]}