如何改变Jettison JSON格式以排除外部对象包装器?

时间:2016-03-25 22:48:23

标签: java json gson jettison

我刚刚开始在一个环境(Java)中工作,该环境使用Jettison专门用于编组(Object - > JSON)和GSON用于解组(JSON - > Object

我在解组使用Jettison marshaller创建的JSON对象时遇到了问题。我注意到对于X类的对象,抛弃生成的字符串是

{"X":{"prop1":"value1", "prop2":"value2"}}

当我尝试用GSON解组它时,prop1和prop2都有空值。

不信任Jettison生成的JSON字符串的格式,我试图反序列化字符串

{"prop1":"value1", "prop2":"value2"}

没有外部JSON包装器,GSON正确处理它。

有没有办法让Jettison在没有附加外包装的情况下生成JSON?或者某种方式让Jettison和GSON一起工作?

1 个答案:

答案 0 :(得分:0)

我对Jettison不是很熟悉,但我认为用GSON可以解决这个问题。

首先,我们可以使用GSON的JsonParser将JSON读入元素树:

String json = "{\"X\":{\"prop1\":\"value1\", \"prop2\":\"value2\"}}";
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(json);
JsonObject object = element.getAsJsonObject();

现在我们要提取" X"这个对象的属性。如果我们知道该属性的名称,我们可以使用:

JsonElement value = object.get("X");

然而,从这个问题来看,这个属性的名称似乎有所不同。在这种情况下,我们需要动态获取第一个属性,例如:

Set<Map.Entry<String, JsonElement>> entrySet = object.entrySet();
Map.Entry<String, JsonElement> firstEntry = entrySet.iterator().next();
JsonElement value = firstEntry.getValue();

一旦我们有了这个值,我们可以像往常一样将它反序列化为我们类的一个实例:

Gson gson = new Gson();
X x = gson.fromJson(value, X.class);
System.out.println(x.prop1);  // prints value1
System.out.println(x.prop2);  // prints value2