使用 GSON 将 json 字符串转换为特定 class 时出现问题

Problem in converting json string to specific class with GSON

我需要将 class 发送到 JSON 格式的 API,然后,我需要在目标函数上对其进行反序列化。所以,我在 java 上使用 GSON。首先,我尝试使用以下方法对其进行序列化:

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: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $

那么,如何在目标中使用 PPFI Class? 谢谢。

示例消息

{"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 class? (这个值是由我之前提到的 GSON 生成的)

一些快速的事情,

  1. 分享 json 内容会有所帮助。
  2. 根据异常消息,预期是Json以“{”开头的对象,但有一个字符串。

再次查看 Json,我们可以确认合适的修复方法。

终于找到问题所在了。当我使用 JsonObject.addProperty("","") 时,值正在转换为字符串,在目标中,我未能成功将字符串转换为 class 的最终实例。所以,有两种解决方案。

更改来源(首选)

我使用 gson.toJson(ppfi) 添加了字符串形式的 ppfi 值。此函数将 return json 字符串。因此,我将其更改为 JsonTree,并将 class 更改为 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());