- java.lang.UnsupportedOperationException: JsonObject
- 1 ответ
- Блог
- Слияние Gson с JSONObject вызывает java.lang.Исключение UnsupportedOperationException
- Вопрос:
- Ответ №1:
- Ответ №2:
- Комментарии:
- java.lang.UnsupportedOperationException: JsonObject — Не уверен, почему
- 1 ответ
- Библиотека для тестирования JSON-RPC API
java.lang.UnsupportedOperationException: JsonObject
Я пытаюсь заставить Identity Toolkit работать на моем Java-приложении Engine на Eclipse. Он отлично работает, пока я не буду выбирать свою учетную запись на AccountChooser.com. После его выбора у меня появляется следующая ошибка:
HTTP ERROR 500 Problem accessing /kalbasidentitytoolkit. Reason: JsonObject Caused by: java.lang.UnsupportedOperationException: JsonObject at com.google.gson.JsonElement.getAsString(JsonElement.java:185) at com.google.identitytoolkit.GitkitVerifierManager.parseCertsResponse(GitkitVerifierManager.java:94)
Я бы сказал, что это была ошибка в Identity Toolkit / ошибка, связанная с неправильным ответом. Я бы предложил установить точку останова и изучить входящий ответ. Вот код: github.com/google/identity-toolkit-java-client/blob/…
1 ответ
Скорее всего, ошибка вызвана недействительным закрытым ключом. Чтобы изолировать основную причину, вы можете получить последнюю версию библиотеки Identity Toolkit 1.2.1, которая была только что выпущена. В этой версии секретный ключ больше не нужен для проверки токена. Сообщите нам, если вы все еще видите ту же ошибку с библиотекой v1.2.6.
Теперь я получаю еще одну ошибку: Problem accessing /kalbasidentitytoolkit. Reason: com.google.common.collect.Iterables.tryFind(Ljava/lang/Iterable;Lcom/google/common/base/Predicate;)Lcom/google/common/base/Optional; Caused by: java.lang.NoSuchMethodError: com.google.common.collect.Iterables.tryFind(Ljava/lang/Iterable;Lcom/google/common/base/Predicate;)Lcom/google/common/base/Optional; at com.google.identitytoolkit.JsonTokenHelper$AudienceChecker.check(JsonTokenHelper.java:74) Может быть, я получаю неправильную библиотеку? Та же ошибка на проекте Maven
Можете ли вы обновить библиотеку гуавы в своем проекте до последней? Для библиотеки Google Identity Toolkit требуется как минимум v16 из библиотеки guava: <зависимость> com.google.guava guava 16.0.1 зависимость>
Блог
Слияние Gson с JSONObject вызывает java.lang.Исключение UnsupportedOperationException
Вопрос:
В некоторых особых случаях я хочу, чтобы 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 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. Это дает мне объединенный набор обоих файлов, но не отвечает на вопрос, как я мог бы получить полные объединенные объекты, не проходя через все остальные члены первого объекта и не создавая новый объект.
java.lang.UnsupportedOperationException: JsonObject — Не уверен, почему
Любая идея, почему я получаю это исключение, хотя я проверил, что JSON не равен нулю?
Да, и все, что делает реализация, это выбрасывает это исключение: github.com/google/gson/blob/master/gson/src/main/java/com/…
Предполагая, что deviceConfig является объектом json, законно ли делать deviceConfig.getAsJsonObject.toString() , чтобы решить эту проблему?
1 ответ
Класс JsonElement — это абстрактный класс, он предназначен для использования через подклассы, которые обеспечивают дальнейшие реализации, для которых абстрактный класс недостаточно конкретен.
Метод getAsString существует, да, но реализован вот так:
/** * convenience method to get this element as a string value. * * @return get this element as a string value. * @throws ClassCastException if the element is of not a and is not a valid * string value. * @throws IllegalStateException if the element is of the type but contains * more than a single element. */ public String getAsString()
Это в основном означает: ожидается, что вы предоставите реализацию в своем подклассе.
Итак, чтобы получить желаемый результат, вам нужно преобразовать переменную в свой подкласс, прежде чем вызывать для него getAsString ().
Почему в документации говорится, что выбрасывается ClassCastException или IllegalStateException, а не выбрасывается исключение UnsupportedOperationException, которое можно увидеть только в реализации. кажется мне немного запутанным. Это потому, что другие 2 исключения могут возникнуть при попытке создать исключение UnsupportedOperationException?
Библиотека для тестирования JSON-RPC API
Когда я впервые столкнулся с написанием тестов для микросервиса, API которого был реализован согласно протоколу JSON-RPC, я осознал что построение качественных проверок для json элементов куда требовательнее, чем я считал ранее.
Ниже приведён простой пример.
- Ответ содержит элемент «jsonrpc» и его значение равняется «2.0»
- Ответ содержит элемент «id» и его значение равняется аналогичному элементу переданному в запросе, в данный момент допустим это — 46929734
Как это необходимо проверить, используя Java + TestNG + Gson:
Assert.assertTrue(response.has("result")); Assert.assertTrue(response.has("jsonrpc")); Assert.assertTrue(response.has("id")); Assert.assertTrue(response.get("result").isJsonPrimitive()); Assert.assertTrue(response.get("jsonrpc").isJsonPrimitive()); Assert.assertTrue(response.get("id").isJsonPrimitive()); Assert.assertEquals(response.get("result").getAsInt(), 12); Assert.assertEquals(response.get("jsonrpc").getAsString(), "2.0"); Assert.assertEquals(response.get("id").getAsInt(), 46929734);
В этот момент, в сознании может начать формироваться вопрос «Зачем так много ассертов?». Да, фактически при тестировании, вас интересует только группа из трех последних ассертов, они проверяют значения json элементов в ответе и если они пройдут — значит ответ соответствует ожиданиям. Но, что если тест упадет? Рассмотрим несколько возможных причин падения такого теста:
Ошибка от TestNG -> java.lang.UnsupportedOperationException: JsonObject
Такое количество проверок, необходимость их написания и поддержки в акутальном состоянии, меня очень огорчало, поэтому я создал отдельную библиотеку, в которой собрал все необходимые, на мой взгляд, проверки для json элементов. Тот же уровень покрытия и детализации, что требовал приведенный выше json с помощью библиотеки достигается тремя строками, вместо девяти.
Gassert.verifyInteger(response, "result", 12); Gassert.verifyString(response, "jsonrpc", "2.0"); Gassert.verifyInteger(response, "id", 46929734);
В библиотеке реализованы методы для проверки:
- элементов всех примитивных типов, вложенных и нет, с проверкой значения и без
- JsonObject, вложенных и нет, с проверкой значения и без
- JsonArray, вложенных и нет, с проверкой значения и без
- JsonNull элементов, вложенных и нет
- типов элементов внутри массива
- содержания массивом ожидаемого элемента
- размерности массива
- размерности обьекта
Рассмотрим повторно возможные причины падения теста:
Библиотека находится в публичном github репозитории, а также добавлена в maven репозиторий.