使用 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 生成的)
一些快速的事情,
- 分享 json 内容会有所帮助。
- 根据异常消息,预期是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());
我需要将 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 生成的)
一些快速的事情,
- 分享 json 内容会有所帮助。
- 根据异常消息,预期是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());