#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. Это дает мне объединенный набор обоих файлов, но не отвечает на вопрос, как я мог бы получить полные объединенные объекты, не проходя через все остальные члены первого объекта и не создавая новый объект.