使用Gson将JsonArray序列化为数组而不是对象

时间:2013-04-01 19:57:08

标签: gson arrays

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

{elements:[{name:“value1},{name:”value2“}]}

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

1 个答案:

答案 0 :(得分: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不考虑运行时类型在重载方法中进行选择时。它绑定到编译时类型。 (Lame - 我知道。)因此,您可能需要将参数类型强制转换为JsonElement,以便让编译器知道要绑定哪个方法。以下内容说明了原始问题中可能发生的事情。

System.out.println(new Gson().toJson((Object)jsonArray));
// {"elements":["one",2,{"foo":"hi"}]}