Проблема при преобразовании строки json в определенный класс с помощью GSON

#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:

Пара быстрых вещей,

  1. Совместное использование содержимого json помогло бы.
  2. На основе сообщения об исключении ожидается, что 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());