从数据库填充 JSONArray 的问题

Posted

技术标签:

【中文标题】从数据库填充 JSONArray 的问题【英文标题】:Problem with populating JSONArray from database 【发布时间】:2019-08-31 07:05:03 【问题描述】:

我正在尝试更新我的旧应用程序,它基本上是一个共享购物清单。它以前链接到我的学校网站和数据库,但由于无法再访问,我对其进行了逆向工程。 该应用程序最初是为 sdk 23 创建的 问题是它似乎没有使用this api 填充 JSONArray。 代码如下:

//MainActivity.java
@Override
    protected Long doInBackground(String... params) 
        HttpsURLConnection connection = null;
        try 
            URL itemListURL = new URL(itemList_URI);
            connection = (HttpsURLConnection) itemListURL.openConnection();
            connection.connect();
            int status = connection.getResponseCode();
            Log.d("HTTPS GET", "status " + status);
            if (status == HttpsURLConnection.HTTP_OK)
                InputStream is = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                String responseString;
                StringBuilder sb = new StringBuilder();
                while ((responseString = reader.readLine()) != null) 
                    sb = sb.append(responseString);
                
                String itemData = sb.toString();
                itemArrayList = Item.createItemList(itemData);
                .......
//Item.java
//Create ItemList
public static ArrayList<Item> createItemList(String jsonItemsString)
        throws JSONException, NullPointerException 
    ArrayList<Item> itemList = new ArrayList<Item>();

    JSONObject jsonData = new JSONObject(jsonItemsString);
    JSONArray jsonItemTable = jsonData.optJSONArray(TABLE_NAME)    
    for (int i = 0; i <= jsonItemTable.length(); i++) 
        JSONObject jsonItem = (JSONObject) jsonItemTable.get(i);
        Item thisItem = new Item(jsonItem);
        itemList.add(thisItem);
    
    return itemList;

for 循环抛出 NullPointerException,这让我相信 JSONArray 没有填充。 这是网址和响应的图片:

所以要么无法读取值,要么数据库连接失败(我对此表示怀疑,因为没有错误指示),但我不知道如何验证这一点 对不起,这可能是一个混乱的问题。我在将近 4 年的时间里做过任何编程,所以有点生疏。我很乐意提供所需的任何信息。

编辑:有人建议一个线程询问 NullPointerException 是什么,可能会解决我的问题,但我知道 npe 是什么,我只是不知道为什么会抛出它

更新:D/HTTP GET:状态 200,应该是“Ok”吗? 我记录了 itemData 字符串,得到了这个,所以它至少可以得到数据: 与 jsonItemsString 相同: 会不会是 "records": - 搞砸的部分?它以前不存在,但似乎对 api 的更新添加了这个。

【问题讨论】:

我强烈建议对 API 调用使用改造之类的库。它会让事情变得容易得多。 github.com/square/retrofit 您能打印出 jsonItemsString 以便我们检查 json 内容吗?问题可能来自这里…… What is a NullPointerException, and how do I fix it?的可能重复 你能调试一下,检查是否在 jsonItemString 中获取值,然后使用 jsonData,以便于识别它! 【参考方案1】:

好的,所以我发现了哪里出错了。 我所做的只是交换

JSONArray jsonItemTable = jsonData.optJSONArray(TABLE_NAME);

JSONArray jsonItemTable = jsonData.getJSONArray("records");

在 Item.java 不知道为什么它在我的第一个版本中有效,但感谢所有评论并让我走上正轨的人!

【讨论】:

以上是关于从数据库填充 JSONArray 的问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP-AJAX:如何通过 php/json 数组从查询中填充 jquery 数据表

将解析的 JSONArray 加载到 recyclerView

从 Android 将 JSONArray 传递给 PHP

使用 Hibernate 从 PostgreSQL 中的 JSONArray 获取对象的问题

ListView 填充了相同的值

使用远程 JSON 数组填充 UIPIckerView