我刚刚开始在一个环境(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一起工作?
答案 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