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

标签 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

如何合并这些对象?

最佳答案

这很容易。只是不要使用 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;
}

关于java - Gson合并JsonObject抛出java.lang.UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40037807/

相关文章:

java gson json对象数组到字符串数组

java - android TextWatcher 改变外部类私有(private)字段

mysql - Async_Http_Response_Handler 出错

java - 将 Json 字符串转换为 JsonObject

java - gson 的 json 和包装器

java - Android:当应用程序未运行或在后台时将 Firebase 推送通知保存到磁盘

java - 为什么 Scala 构建自己的 ForkJoinPool 而不是使用 java.util.concurrent.ForkJoinPool#commonPool?

java - 使用模拟验证错误消息,其中结果可以根据 id 更改

Java 消息服务和 Haskell

java - 来自 Kent Beck 的 TDD 的 Money Example by example