Слияние Gson с JSONObject вызывает java.lang.Исключение UnsupportedOperationException

#java #gson

#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

Как я могу объединить эти объекты?

Ответ №1:

Это просто. Просто не объединяйте их с помощью 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;
}
 

Ответ №2:

Исключение связано с тем, что EntrySet реализация библиотеки GSON не реализует add функцию.

Я давно не касался библиотеки GSON. Но, может быть, вы могли бы попробовать что-то вроде этого

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

Комментарии:

1. Это дает мне объединенный набор обоих файлов, но не отвечает на вопрос, как я мог бы получить полные объединенные объекты, не проходя через все остальные члены первого объекта и не создавая новый объект.