2

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

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

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

当我尝试使用 GSON 对其进行解组时,prop1 和 prop2 都具有空值。

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

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

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

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

4

1 回答 1

0

我对 Jettison 不是很熟悉,但我认为可以使用 GSON 来处理这个问题。

首先,我们可以使用 GSONJsonParser将 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
于 2016-03-27T11:37:13.503 回答