Java lang unsupportedoperationexception jsonobject

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 элементов куда требовательнее, чем я считал ранее.

Ниже приведён простой пример.

  1. Ответ содержит элемент «jsonrpc» и его значение равняется «2.0»
  2. Ответ содержит элемент «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 репозиторий.

Источник

Читайте также:  Python зачем нужны вложенные функции
Оцените статью