Json Structure是如此不同,无法将其更改为Java对象

时间:2013-11-21 13:37:25

标签: java json facebook facebook-graph-api gson

我正在开发facebook应用程序。当我查询https://graph.facebook.com/me/video.watches?offset=0&limit=1000时,我收到了观看电影列表。例如。我在这里只粘贴了一部电影。

{
  "data": [
    {
      "id": "664878940211923", 
      "data": {
        "tv_show": {
          "id": "108611845829948", 
          "url": "https://www.facebook.com/pages/Popeye-the-Sailor/108611845829948", 
          "type": "video.tv_show", 
          "title": "Popeye the Sailor"
        }
      }, 
      "type": "video.watches", 
    },

这是我创建的POJO类,用于将其转换为Java。

import java.util.List;

public class FBUserVideoWatches {
    private List<Data> data;

    public List<Data> getData() {
        return data;
    }
    public void setData(List<Data> data) {
        this.data = data;
    }
    public class Data{
        private long id;
        private TVData data;
        private String type;

        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
        public TVData getData() {
            return data;
        }
        public void setData(TVData data) {
            this.data = data;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
    }

    public class TVData{
        private TV_Shows tv_shows;

        public TV_Shows getTv_shows() {
            return tv_shows;
        }

        public void setTv_shows(TV_Shows tv_shows) {
            this.tv_shows = tv_shows;
        }
    }
    public class TV_Shows{
        private long id;
        private String url;
        private String type;
        private String title;

        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
    }
}

以下是我将json转换为java的方法。

FBUserVideoWatches fbUserVideoWatches = gson.fromJson(response.getBody(), FBUserVideoWatches.class);

            for (Data data : fbUserVideoWatches.getData()) {
                System.out.println(data.getId());//This only works and I am getting values.
                if(null != data.getData()){ 
                    if(null!=data.getData().getTv_shows()){
                        System.out.print(data.getData().getTv_shows().getTitle());
                    }
                    if(null!=data.getData().getTv_shows()){
                        System.out.print(data.getData().getTv_shows().getType());
                    }
                }
            }

当我使用getter方法从java类获取数据时,我得到ID 664878940211923&amp; "type": "video.watches"如上所示。 "tv_show"内的成员我无法访问。我认为在创建POJO时出错了。我无法找到那个错误。请帮助我做一些必要的修正工作。希望我的问题很明确。在此先感谢。

1 个答案:

答案 0 :(得分:2)

你在TVData Class中错误地将你忘记的序列化名称放在实例属性上,因为它在json和TV数据类中是不同的

@SerializedName(value="tv_show")
private TV_Shows tv_shows;

假设你的json是这样的

{
 "data":[
      {
         "id":"664878940211923",
         "data":{
            "tv_show":{
               "id":"108611845829948",
               "url":"https://www.facebook.com/pages/Popeye-the-Sailor/108611845829948",
               "type":"video.tv_show",
               "title":"Popeye the Sailor"
            }
         },
         "type":"video.watches"
      },
      {
         "id":"664878940211923",
         "data":{
            "tv_show":{
               "id":"108611845829948",
               "url":"https://www.facebook.com/pages/Popeye-the-Sailor/108611845829948",
               "type":"video.tv_show",
               "title":"Popeye the Sailor"
            }
         },
         "type":"video.watches"
      }
   ]
}

根据您的json格式,解析模型将如下所示

public class FBUserVideoWatches {

    private List<Data> data;

    public List<Data> getData() { return data; }

    public void setData(List<Data> data) {  this.data = data;}
}


public class Data {

    private TVData data;

    private String id;
    private String type;

// setter/getter here
}

public class TVData {

    @SerializedName(value="tv_show")
    private Show show;
// setter/getter here
}

public class Show {

    private String id;
    private String url;
    private String type;
    private String title;
       // setter/getter here
   }

最后,谷歌Gson解析您的对象,如下所示

Gson gson = new Gson();
FBUserVideoWatches fbUserVideoWatches =gson.fromJson(json_string, FBUserVideoWatches.class);