2

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

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

如何从序列化中删除元素?

4

1 回答 1

1

我去看了医生,因为我走路的时候脚疼。医生说:“不要在上面行走。”

通常,在使用像 Gson 这样的 API 时,人们宁愿不知道它的JsonArray存在,他们宁愿只使用 API 的数据绑定部分。JsonArray因此,与其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 表示。因此,它可能不会String在 Gson 的未来版本中返回相同格式的 a。

无论如何,如果你真的想使用 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方法已经以这种方式使用(序列化 a JsonArray),但输出如原始问题中所示,请回想一下,Java 在重载方法中进行选择时不会考虑运行时类型。它绑定到编译时类型。(蹩脚——我知道。)因此,您可能需要将参数类型转换为JsonElement,让编译器知道要绑定到哪个方法。以下演示了原始问题中可能有效发生的情况。

System.out.println(new Gson().toJson((Object)jsonArray));
// {"elements":["one",2,{"foo":"hi"}]}
于 2013-04-03T05:42:26.290 回答