【问题标题】:Why does Gson expect the beginning array but gets an object instead?为什么 Gson 期望开始数组但得到一个对象?
【发布时间】:2015-09-06 13:06:29
【问题描述】:

我正在使用这个 JSON 存储一些带有 Retrofit 的文章,但我有一个错误:

应为 BEGIN_ARRAY,但在第 1 行第 2 列是 BEGIN_OBJECT

这是我的代码:

RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint("http://www.example.com/")
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .build();

Flow flowservice = restAdapter.create(Flow.class);

flowservice.getArticles("55ec320b066ee7ae08360f12", new Callback<List<String>>() {

    @Override
    public void success(List<String> objects, Response response) {
        textView.setText(objects.get(0));
    }

    @Override
    public void failure(RetrofitError error) {
        textView.setText(error.getMessage());
    }
});

我使用这个 POJO:

public class Article implements Serializable {
    private int remoteId;
    private String title;
    private String imageUrl;
    private String content;
    private int viewsCount;
    private int commentsCount;
    private int likesCount;
    private int categoryId;
    private String authorName;
    private boolean liked;

    // getters and setters removed
}

还有一个示例 JSON:

{  
   "success":true,
   "errorCode":0,
   "articles":[  
      {  
         "remoteId":0,
         "title":"Nam viverra vulputate lacus nec pellentesque. Nam viverra vulputate lacus nec pellentesque.",
         "imageUrl":"/articles/armatis.png",
         "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas interdum tempus ultrices. Ut quis tellus molestie, ornare mi non, fermentum nisl. Sed vitae ultricies metus. Vivamus aliquam metus enim, ut fringilla justo molestie et. Maecenas nec ligula neque. Mauris vel cursus risus. Suspendisse ut nulla porta, congue nulla sit amet.",
         "viewsCount":235,
         "commentsCount":6,
         "likesCount":18,
         "categoryId":1,
         "authorName":"Sébastien Gabory",
         "liked":false
      },
      {  
         "remoteId":1,
         "title":"Nam viverra vulputate lacus nec pellentesque.",
         "imageUrl":"/articles/armatis.png",
         "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas interdum tempus ultrices. Ut quis tellus molestie, ornare mi non, fermentum nisl. Sed vitae ultricies metus. Vivamus aliquam metus enim, ut fringilla justo molestie et. Maecenas nec ligula neque. Mauris vel cursus risus. Suspendisse ut nulla porta, congue nulla sit amet.",
         "viewsCount":18,
         "commentsCount":6,
         "likesCount":25,
         "categoryId":1,
         "authorName":"Sébastien Gabory",
         "liked":false
      }
   ]
}

流类:

public interface Flow {
    @GET("/v2/{json}")
    void getArticles (@Path("json") String json ,Callback<List<Article>> callback);
}

【问题讨论】:

    标签: java android json gson retrofit


    【解决方案1】:

    GSON 正在尝试将您的 JSON 响应直接转换为文章列表。但是,您的文章列表实际上嵌套在外部 JSON 对象的深处。当 GSON 尝试将此外部对象转换为 JSON 数组(最终转换为 Java List)时,它会抛出您看到的错误:

    应为 BEGIN_ARRAY,但在第 1 行第 2 列是 BEGIN_OBJECT

    对此的一种解决方法是创建一个新的 POJO 来表示整个 JSON 响应。例如:

    public class ArticleListWrapper implements Serializable {
        private boolean success;
        private double errorCode;
        private List<Article> articles;
    
        // getters and setters, etc.
    }
    

    那么您的Flow 课程将更新如下:

    @GET("/v2/{json}")
    void getArticleListWrapper (@Path("json") String json, Callback<ArticleListWrapper> callback);
    

    然后,GSON 应该能够正确地将 JSON 响应反序列化为 ArticleListWrapper 对象。您可以通过访问此ArticleListWrapper 对象的articles 字段来检索回调中的文章列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多