You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何从URL获取特定JSON数据值?代码求助

解决无法从ThingSpeak JSON中提取feeds数组内entry_id的问题

你的问题根源很明确:你把feeds当成了JSON对象,但实际上它是一个JSON数组。ThingSpeak的这个接口返回的feeds字段是包含多个数据条目的数组,每个条目才是包含entry_id的独立对象。

先看接口返回的JSON结构示例

你调用的接口返回的JSON大致是这样的结构:

{
  "channel": {
    "id": 494244,
    "name": "...",
    // 其他channel字段
  },
  "feeds": [
    {"entry_id": 123456, "field1": "xxx"},
    {"entry_id": 123457, "field1": "yyy"}
  ]
}

你的代码错误点

你在doInBackground里写了:

JSONObject feeds=object.getJSONObject("feeds");

这行代码试图把数组类型的feeds当成对象来解析,必然会抛出JSONException,导致无法获取数据。

修正后的完整fetchData类代码

下面是修复后的代码,同时还修正了循环读取输入流的逻辑错误:

public class fetchData extends AsyncTask<Void,Void,Void> { 
    String data=""; 
    String entryId=""; 
    // 如果需要获取所有entry_id,可以用List存储:
    // List<String> entryIdList = new ArrayList<>();

    @Override 
    protected Void doInBackground(Void... voids) { 
        try { 
            URL url=new URL("https://api.thingspeak.com/channels/494244/fields/1.json?api_key=3O8HR1YR38GCGD31&results=2"); 
            HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection(); 
            InputStream inputStream=httpURLConnection.getInputStream(); 
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); 
            String line=""; 
            // 修正循环读取逻辑:先读取再判断是否为null
            while((line=bufferedReader.readLine())!=null){ 
                data=data+line; 
            } 
            JSONObject object=new JSONObject(data); 
            // 关键修正:feeds是数组,使用getJSONArray获取
            JSONArray feedsArray = object.getJSONArray("feeds");
            
            // 获取第一个条目的entry_id(如果数组不为空)
            if(feedsArray.length() > 0){
                JSONObject firstFeedItem = feedsArray.getJSONObject(0);
                entryId = firstFeedItem.getString("entry_id");
            }

            // 如果需要获取所有entry_id,遍历数组即可:
            /*
            for(int i=0; i<feedsArray.length(); i++){
                JSONObject feedItem = feedsArray.getJSONObject(i);
                entryIdList.add(feedItem.getString("entry_id"));
            }
            */

        } catch (MalformedURLException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } catch (JSONException e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
        super.onPostExecute(aVoid); 
        // 显示单个entry_id
        MainActivity.data.setText(this.entryId);
        // 如果显示所有entry_id,用逗号拼接:
        // MainActivity.data.setText(TextUtils.join(", ", entryIdList));
    }
}

额外优化建议

  • 尽量不要把Activity里的UI组件(比如data TextView)设为public static,这种写法容易引发内存泄漏。推荐用接口回调或者WeakReference来传递解析结果到Activity。
  • 网络请求操作在Android 9及以上版本需要在AndroidManifest.xml中添加android:usesCleartextTraffic="true",不过你已经用了HTTPS,这部分没问题。

内容的提问来源于stack exchange,提问作者Anjula Paulus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:48:01