【问题标题】:Android - Volley with GSON returns null list of valuesAndroid - 带有 GSON 的 Volley 返回空值列表
【发布时间】:2015-11-10 01:52:29
【问题描述】:

我正在尝试做一个简单的 Volley+GSON 应用,只是从在线 JSON 文件中提取数据

JSON

{
  "tag": [
    {
      "id": "5",
      "name": "1"
    },
    {
      "id": "5",
      "name": "1"
    }
  ]
}

我做了一个类作为模型

public class obj {
    private String id;
    private String name;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

}

还有这个类

public class objArray {
    public ArrayList<obj> results;

    public ArrayList<obj> getResults() {
        return results;
    }

}

然后我提出了这个要求

GsonRequest<objArray> jsObjRequest = new GsonRequest<objArray>(
                Request.Method.GET,
                _LINK,
                objArray.class, null,
                createSuccessListener(),
                createErrorListener());

所以当我尝试像这样操作输出时

response.getObjs().get(0).getName();

我得到一个空异常,似乎 response.getObjs() 返回空,响应本身不是空的,只是它里面的数组,我该如何解决这个问题?问题可能出在 JSON 或 GsonRequest 类中吗? 以下是我在 GsonRequest 类中获得响应的方式:

return Response.success(gson.fromJson(json,clazz),HttpHeaderParser.parseCacheHeaders(response));

【问题讨论】:

  • 如果请求成功完成并且没有错误,您可以尝试查看日志。
  • result != tag,所以...
  • 据我所知,请求已成功完成,因为我可以读取 URL 内容,打印变量 json(其中包含来自 URL 的数据的字符串)为我提供了完整打印的 JSON 内容.
  • @njzk2 哇!我怎么看不到!?你不会相信我花了多少时间来解决这个问题。谢啦!这解决了它!现在我确实得到了数据!再次感谢!如果您愿意,请将其添加为答案,我会接受。
  • @njzk2 usahname 把我和 njzk2 结合起来。

标签: android json gson android-volley


【解决方案1】:

编辑:感谢@njzk2,我能够纠正这个问题,问题出在 objArray 类中,保存数组的变量称为“results”,JSON 文件中没有称为 results 的元素或数组,就是这样将值设为空,我在 JSON 文件中的数组被称为“tag”,因此该变量应该被命名为“tag”。

public ArrayList<Tag> tag;

请注意,问题不是因为缺少 @tinysunlight 声明的构造函数或设置器,我没有添加它们,应用程序仍然按预期运行。


return Response.success(gson.fromJson(new JSONObject(json).getString("tag"),clazz),HttpHeaderParser.parseCacheHeaders(response));

gson 要求 modal 应该有一个空的构造函数和所有的 getter 和 setter:

public class obj {
    private String id;
    private String name;
   public obj(){}
    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name= name;
    }
}

【讨论】:

  • 并非如此。因为obj 扩展了Object,并且由于在obj 和Object 中都没有定义其他构造函数,所以来自Object 的默认空构造函数对obj 有效
  • Gson 要求的!
  • 没有 GSON 教程表明这一点。仍然不是问题,由于@njzk2 的回答,该应用程序在没有它的情况下也能正常工作。谢谢你的回答:)。
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2018-12-13
  • 1970-01-01
相关资源
最近更新 更多