2016-10-14 3 views
0

В некоторых особых случаях я хочу, чтобы jsonObjects были объединены в один объект. я прочитал оба объекта из файлаGson merging JsonObject throws java.lang.UnsupportedOperationException

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

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

ответ

0

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

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

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

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

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; 
} 
Смежные вопросы