【问题标题】:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECTcom.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为字符串但为 BEGIN_OBJECT
【发布时间】:2014-09-29 14:02:09
【问题描述】:

我已经尝试解析这个 json

{"status":"ok","results":{"query":{"id":"6081","name":"UB1656-Palazzo Versace Resort in Culture Village","query":"Aswathy VS : <\/strong>
Test Query","add_date":"2014-08-05 08:27:45"},"replies":[{"replied_by":"Ventures Onsite","replied_on":"05-Aug-2014 09:05:19 AM","reply":"We have received your Test Query."},{"replied_by":"Me","replied_on":"05-Aug-2014 01:28:00 PM","reply":"Thanks... "}]}}

我的 Pojo 课程

import java.util.ArrayList;

public class QueryRepliesList {
    public String status;

public ArrayList<Result> results;

    public class Replies {

        public String id;
        public String name;
        public String query;
        public String add_date;
        public String replied_by;
        public String replied_on;
        public String reply;

    }

    public class Result {

        public ArrayList<Replies> query;
        public ArrayList<Replies> replies;


    }
}

我试着用

来称呼它
QueryRepliesList        queryReply = gson.fromJson(reader,
                            QueryRepliesList.class);

但我得到了以下异常

原因:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为字符串但为 BEGIN_OBJECT

我尝试过改变

Pojo 课程几次,如对问题的类似回答所建议的那样 但没有任何效果 请有人帮忙 提前致谢

【问题讨论】:

  • 是的,我使用这个链接检查了我的 Json jsonviewer.stack.hu
  • 我的意思是您的 POJO 与您的 json 不匹配。例如,您已将 results 声明为一个集合,但 json 包含一个对象。
  • 你能推荐我一门 Pojo 课吗

标签: android json exception gson


【解决方案1】:

根据您提供的JSON,我看不到您将如何获得提供的错误,而是您会看到

应为 BEGIN_ARRAY,但为 BEGIN_OBJECT

因为resultsquery 都是JSON_OBJECT。为了说明,我将所有内容都放入了一个 junit 测试中。

@org.junit.Test
public void asPosted() {
    final String json = "{'status':'ok','results':{'query':{'id':'6081','name':'UB1656-Palazzo Versace Resort in Culture Village','query':'Aswathy VS : <\\/strong>\n"
            + "Test Query','add_date':'2014-08-05 08:27:45'},'replies':[{'replied_by':'Ventures Onsite','replied_on':'05-Aug-2014 09:05:19 AM','reply':'We have received your Test Query.'},{'replied_by':'Me','replied_on':'05-Aug-2014 01:28:00 PM','reply':'Thanks... '}]}}";

    QueryRepliesContainer data = new Gson().fromJson(json, QueryRepliesContainer.class);
    Assert.assertEquals("ok", data.getStatus());
    Assert.assertEquals(2, data.getRepliesCount());
    Assert.assertEquals("6081", data.getQueryId());
}

通常,您将为每个JSON_OBJECT 创建一个POJO。例外情况包括提供自定义反序列化器。根据您需要公开“内部”数据的程度,您需要将内部类迁移到公共级别公开。我已经将它们分别嵌套到 JSON 结构中。因此,根据提供的内容,您将需要类似于以下内容:

 class QueryRepliesContainer {

    private String status;
    private Result results;

    public String getStatus() {
        return status;
    }

    public int getRepliesCount() {

        return results.replies.size();
    }

    public String getQueryId() {
        return results.query.id;
    }

    private class Result {

        private Query query;
        private List<Replies> replies;

        private class Query {

            private String id;
            private String name;
            private String query;
        }

        private class Replies {

            private String add_date;
            private String replied_by;
            private String replied_on;
            private String reply;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-11-06
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2016-08-28
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多