为了账号安全,请及时绑定邮箱和手机立即绑定

“预期BEGIN_Object,但在第1列为字符串”

“预期BEGIN_Object,但在第1列为字符串”

牧羊人nacy 2019-07-03 17:30:31
“预期BEGIN_Object,但在第1列为字符串”我有这样的方法:public static Object parseStringToObject(String json) {     String Object = json;     Gson gson = new Gson();     Object objects = gson.fromJson(object, Object.class);     parseConfigFromObjectToString(object);     return objects;}我想用以下方法解析一个JSON:public static void addObject(String IP, Object addObject) {     try {         String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));         addObject = ConfigJSONParser.parseStringToObject(json);     } catch (Exception ex) {         ex.printStackTrace();     }}但我收到一条错误信息:JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_Object,但在第1列为String
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

即使没有看到JSON字符串,您也可以从错误消息中看出,将其解析为类的实例并不是正确的结构。

gson期望您的JSON字符串以打开大括号的对象开始。G.

{

但是,您传递给它的字符串以一个打开的引号开头。

"


查看完整回答
反对 回复 2019-07-03
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

来自服务器的无效JSON应该始终是预期的用例。在传输过程中,有一百万件事情会出错。GSON有点棘手,因为它的错误输出会给您带来一个问题,您捕获的实际异常将是另一种类型。

考虑到所有这些,客户端的正确修复方法是

try{
  gson.fromJSON(ad, Ad.class);
  //...}catch (IllegalStateException | JsonSyntaxException exception){
  //...

如果您想知道从服务器收到的JSON错误的原因,可以在CATCH块内部查看异常。但是,即使这是你的问题,也不是客户从互联网上收到的修复JSON的责任。

无论哪种方式,当它得到坏的JSON时,客户端都有责任决定该做什么。有两种可能性是拒绝JSON,什么也不做,然后再试一次。

如果要再次尝试,我强烈建议在try/catch块内设置一个标志,然后在try/catch块之外响应该标志。嵌套TRY/CATCH很可能是gson使我们陷入这种混乱的堆栈跟踪和异常不匹配的原因。

换句话说,即使我承认它看起来不太优雅,我还是建议

boolean failed = false;try{
  gson.fromJSON(ad, Ad.class);
  //...}catch (IllegalStateException | JsonSyntaxException exception){
  failed = true;
  //...}if (failed){
  //...


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 661 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信