我正在使用 Gson 库,但是当它序列化 JsonArray 对象时,它似乎将其序列化为对象而不是 JSON 数组。IE
{ 元素:[ {name:"value1}, {name:"value2"}]}
如何从序列化中删除元素?
我去看了医生,因为我走路的时候脚疼。医生说:“不要在上面行走。”
通常,在使用像 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"}]}