【问题标题】:Problem in converting json string to specific class with GSON使用 GSON 将 json 字符串转换为特定类的问题
【发布时间】:2021-01-13 07:43:00
【问题描述】:

我需要将一个类发送到 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: 应为 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 生成的)

【问题讨论】:

  • 我不明白你为什么将它转换为字符串并再次解析它。您可以直接在jelement.get("ppfi") 上调用fromJson 并获取您的对象。
  • @MohammadOmidvar 谢谢,正如你所说,我添加了以下内容:PPFI myPPFI = gson.fromJson(jelement.get("ppfi"),PPFI.class); 但我得到了同样的错误。

标签: json spring-boot spring-mvc gson


【解决方案1】:

几件快速的事情,

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

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

【讨论】:

  • 谢谢,我将消息作为示例消息添加到问题中。
【解决方案2】:

最后,我发现了问题所在。当我使用JsonObject.addProperty("","") 时,该值正在转换为字符串,并且在目的地中,我没有成功将字符串转换为类的最终实例。所以,有两种解决方案。

更改来源(首选)

我使用gson.toJson(ppfi) 将ppfi 值添加为字符串。此函数将返回 json 字符串。所以,我把它改成了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());

【讨论】:

    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2015-01-11
    • 2021-10-04
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多