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组件(比如
dataTextView)设为public static,这种写法容易引发内存泄漏。推荐用接口回调或者WeakReference来传递解析结果到Activity。 - 网络请求操作在Android 9及以上版本需要在
AndroidManifest.xml中添加android:usesCleartextTraffic="true",不过你已经用了HTTPS,这部分没问题。
内容的提问来源于stack exchange,提问作者Anjula Paulus
相关产品推荐
相关产品推荐

