java - Json 结构如此不同,无法将其更改为 Java 对象

标签 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"type": "video.watches" 如上所示。我无法访问“tv_show”内的成员。我认为我在创建 POJO 时出错了。我无法找到那个错误。请帮助我进行哪些修正才能使其发挥作用。希望我的问题很清楚。提前致谢。

最佳答案

您在 TVData 类中犯了错误,您忘记了实例属性上的序列化名称,因为它在 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
   }

最后使用 Google Gson 解析您的对象,如下所示

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

关于java - Json 结构如此不同,无法将其更改为 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20122484/

相关文章:

java - 不使用 OPENGL 在 Android 中制作动画

Java递归 "find median"算法异常错误

ios - 无法以编程方式向按钮添加约束 - Swift 2.0

facebook - 通过 FB api 创建一个新的 FaceBook 页面

java - 捕获 DataAccessException 并重新抛出包含 SQL 错误代码的自定义异常

java - Java异常抛出对象并从catch中获取对象

php - 从Mysql中提取Json php MultilineString坐标

java - 将平面 JSON 结构转换为对象并添加另一个属性

java - 未处理的异常 org.json.jsonexception

javascript - 在 Meteor 中登录并注册 Facebook 时出现问题