Gson合并JsonObject会抛出java.lang.UnsupportedOperationException

时间:2016-10-14 07:51:13

标签: java gson

在某些特殊情况下,我希望将jsonObjects合并到一个对象中。 我从文件中读取了两个对象

new JsonParser().parse(new FileReader(definitionFile)).getAsJsonObject();

并且两个文件具有相同的结构。 我尝试使用以下代码合并文件:

public JsonObject merge(JsonObject firstObject, JsonObject secondObject) throws Exception {
    firstObject.getAsJsonObject(BaseGenerator.MEMBER_METHODS).entrySet()
            .addAll(secondObject.getAsJsonObject(BaseGenerator.MEMBER_METHODS).entrySet());
    return firstObject;
}

但是在尝试合并这些对象时会抛出异常:java.lang.UnsupportedOperationException

如何合并这些对象?

2 个答案:

答案 0 :(得分:0)

异常是因为GSON库的EntrySet实现没有实现add函数。

我很长时间没有接触过GSON lib。但是,也许你可以试试这样的东西

new HashSet(firstObject.getAsJsonObject(BaseGenerator.MEMBER_METHODS).entrySet()).addAll(secondObject.getAsJsonObject(BaseGenerator.MEMBER_METHODS).entrySet())`

答案 1 :(得分:0)

这很容易。只是不要使用entrySet()方法合并它们,因为该方法返回的集合不会实现Set.add / Set.addAll

private static void mergeInto(final JsonObject o1, final JsonObject o2) {
    for ( final Entry<String, JsonElement> e : o2.entrySet() ) {
        o1.add(e.getKey(), e.getValue());
    }
}

此外,上面的方法没有返回任何内容,以便明确指出参数可能会改变它们的内部状态 - 实际上是第一个参数(对于任何期望从返回某些东西的方法获得新东西的人来说,这通常是一个大惊喜)。我会创建一个新的JsonObject实例,以便不触及参数状态,如:

private static JsonObject merge(final JsonObject o1, final JsonObject o2) {
    final JsonObject merged = new JsonObject();
    mergeInto(merged, o1);
    mergeInto(merged, o2);
    return merged;
}