【问题标题】:Serializing JsonArray as array and not object using Gson使用 Gson 将 JsonArray 序列化为数组而不是对象
【发布时间】:2025-11-24 07:10:01
【问题描述】:

我正在使用 Gson 库,但是当它序列化 JsonArray 对象时,它似乎将其序列化为对象而不是 JSON 数组。即

{ 元素:[ {name:"value1}, {name:"value2"}]}

如何删除被序列化的元素?

【问题讨论】:

  • 您是否直接使用 JsonArray,而不是仅使用 Gson 的数据绑定 API,以便自定义输出,或者数据绑定 API 的其他一些不适合您的缺点需要? (使用 JsonElements 不如只使用简单的数据绑定 API,这是 Gson 擅长的地方。)

标签: gson arrays


【解决方案1】:

我去看了医生,因为我走路的时候脚疼。医生说:“别踩它。”

一般来说,当使用像 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"}]}

【讨论】: