#json #spring-boot #spring-mvc #gson
#json #spring-boot #spring-mvc #gson
Вопрос:
Мне нужно отправить класс в API с форматом JSON, а затем мне нужно десериализовать его в целевой функции. Итак, я использую GSON на Java. Сначала я попытался сериализовать ее с помощью следующего метода:
Gson gson = new Gson();
JsonObject userPpfi = new JsonObject();
userPpfi.addProperty("user", "shahab@gmail.com");
userPpfi.addProperty("ppfi", gson.toJson(oppfi));
и после получения ее в пункте назначения я использую следующие коды для получения этих параметров. Я могу успешно получить пользователя, но когда мне нужно десериализовать второй метод с помощью GSON, произойдет ошибка.
JsonObject jelement = new JsonParser().parse(message).getAsJsonObject();
user = jelement.get("user").
ppfi = jelement.get("ppfi").toString();
System.out.println("new ppfi : " gson.fromJson(ppfi,PPFI.class).getId());
И ошибка:
com.google.gson.Исключение JsonSyntaxException: java.lang.Исключение IllegalStateException: ожидаемый BEGIN_OBJECT, но был СТРОКОЙ в строке 1, столбец 2, путь $
Итак, как я могу использовать класс PPFI в пункте назначения? Спасибо.
пример сообщения
{"user":"shahab@gmail.com","ppfi":"{"_id":"1213","Name":"something","item":5,"Items":[{"Type":"pizza","Count":0},{"Type":"drink","Count":0},{"Type":"soup","Count":0}],"itemtime":"Sep 28, 2020, 9:25:31 AM","itemtime2":"Sep 28, 2020, 8:25:31 AM","itemtime3":"Sep 28, 2020, 10:55:39 AM","itemspec":[]}"}
и я знаю, что это основная проблема (» в начале следующей строки):
"{"_id":"1213","Name":"something","item":5,"Items":[{"Type":"pizza","Count":0},{"Type":"drink","Count":0},{"Type":"soup","Count":0}],"itemtime":"Sep 28, 2020, 9:25:31 AM","itemtime2":"Sep 28, 2020, 8:25:31 AM","itemtime3":"Sep 28, 2020, 10:55:39 AM","itemspec":[]}"
Как я могу преобразовать значение ppfi в класс PPFI?? (это значение генерируется GSON, как я упоминал ранее)
Комментарии:
1. Я не понимаю, почему вы преобразуете ее в строку и снова анализируете ее. Вы можете
fromJson
напрямую вызватьjelement.get("ppfi")
и получить свой объект.2. @MohammadOmidvar Спасибо, как вы сказали, я добавляю следующее:
PPFI myPPFI = gson.fromJson(jelement.get("ppfi"),PPFI.class);
но я получаю ту же ошибку.
Ответ №1:
Пара быстрых вещей,
- Совместное использование содержимого json помогло бы.
- На основе сообщения об исключении ожидается, что JSONObject начинается с «{«, но есть строка.
Опять же, посмотрев на Json, мы можем подтвердить, какое подходящее исправление будет.
Комментарии:
1. Спасибо, я добавил сообщение к вопросу в качестве примера сообщения .
Ответ №2:
Наконец, я узнал о проблеме. Поскольку я использовал JsonObject.addProperty("","")
, значение преобразовывалось в строку и в пункте назначения, мне не удалось преобразовать строку в конечный экземпляр класса. Итак, есть два решения.
Изменение источника (предпочтительно)
Я добавил значение ppfi в виде строки, используя gson.toJson(ppfi)
. Эта функция вернет строку json. Итак, я изменил его на a JsonTree
и поместил класс в JsonTree
. Итак, это последняя версия моей исходной функции:
Gson gson = new Gson();
JsonObject userPpfi = new JsonObject();
userPpfi.addProperty("user", "shahab@gmail.com");
userPpfi.add("ppfi", new Gson().toJsonTree(oppfi));
sqs.sendMessage((gson.toJson(userPpfi)));
и в целевой функции я использую ее как простую строку Json.
String ppfiFromMessage = jelement.get("ppfi").toString();
currentPPfi = gson.fromJson(ppfiFromMessage,PPFI.class);
И теперь я могу использовать currentPPFI
.
Изменение только назначения
Вы можете заменить все только
из PPFI. Итак, просто используйте
JsonObject jelement = new JsonParser().parse(message).getAsJsonObject();
user = jelement.get("user").
ppfi = jelement.get("ppfi").toString().replace("\","");
System.out.println("new ppfi : " gson.fromJson(ppfi,PPFI.class).getId());