预期 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 处 BEGIN_OBJECT

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我收到来自 Flickr api 的 Json 回复,类似于:

{
  "photos": {
    "page": 1,
    "pages": 1,
    "perpage": 100,
    "total": 2,
    "photo": [
      {
        "id": "14774811932",
        "owner": "32738276@N08",
        "secret": "cbb99f0039",
        "server": "3853",
        "farm": 4,
        "title": "Weltschmerz",
        "ispublic": 1,
        "isfriend": 0,
        "isfamily": 0,
        "date_faved": "1432471819"
      },
      {
        "id": "13274800365",
        "owner": "114920113@N07",
        "secret": "b652859e6a",
        "server": "3688",
        "farm": 4,
        "title": "cactus desert",
        "ispublic": 1,
        "isfriend": 0,
        "isfamily": 0,
        "date_faved": "1432466782"
      }
    ]
  },
  "stat": "ok"
}

我需要在 ArrayList 中获取两个 Photo 对象。

我的代码是:

Helper helper = new Helper(this);
    String jsonString = helper.loadJSONFromAsset();
    Gson gson = new Gson();
    Photos photos = gson.fromJson(jsonString,
                new TypeToken<Photos>() { }.getType());
   // ArrayList<Photo> photos = gson.fromJson(jsonString,
   //             new TypeToken<ArrayList<Photo>>(){}.getType());

目前我从资产加载文件。当它起作用时,我会将其更改为 flickr api

照片 class :

public class Photos {
    Integer page;
    Integer pages;
    Integer perpage;
    Integer total;
    ArrayList<Photo> photos;
    String stat;


//getters and setters here

我的理解是,我必须先提取 photos 项目,然后从该项目提取数组 photo 这样我才能得到我需要的 ArrayList。

我认为您必须像这样创建 Gson TypeToken:

public class Photos {
   Integer page;
   Integer pages;
   Integer perpage;
   Integer total;
   ArrayList<Photo> photo;
   String stat;

   //setters and getters

}

通过这种方式,您可以复制 Flickr JSON,Gson 将 Json 正确映射为:

 Photos photos = gson.fromJson(jsonString,
            new TypeToken<Photos>(){}.getType());

然后你可以得到你的照片 ArrayList:

 photos.getPhoto();