Android Studio中解析DarkSky JSON获取summary值失败求助
解决DarkSky JSON解析中"No value for data"的问题
嘿,别担心,这个问题其实很常见——就是JSON层级没搞对而已!咱们来一步步搞定它:
问题根源
你的JSON响应里,data数组并不是直接在根JSON对象下,而是嵌套在daily这个子对象里面的。你现在直接从根对象去取data,自然会找不到这个键,这就是Logcat抛出No value for data异常的原因。
咱们再确认下你的JSON结构:
{"latitude":..., "daily":{"data":[{"time":1570374000,"summary":"Light rain until evening.",...}]},...}
看到了吧?data是属于daily的子属性,所以得先拿到daily对象,再从中提取data数组。
修正后的解析代码
把你的jsonParse()方法改成下面这样就行:
private void jsonParse() { String jsonRawData = tvForecast.getText().toString(); try { JSONObject jsonObject = new JSONObject(jsonRawData); // 第一步:先获取嵌套的daily对象 JSONObject dailyObject = jsonObject.getJSONObject("daily"); // 第二步:从daily对象里取出data数组 JSONArray jsonArray = dailyObject.getJSONArray("data"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject data = jsonArray.getJSONObject(i); String summary = data.getString("summary"); tvSummary.append(summary); } } catch (JSONException e) { e.printStackTrace(); } }
额外小建议
为了让代码更健壮,你可以添加一些空值检查,避免因为JSON结构变化或者缺失字段导致异常,比如:
private void jsonParse() { String jsonRawData = tvForecast.getText().toString(); try { JSONObject jsonObject = new JSONObject(jsonRawData); // 检查daily对象是否存在 if(jsonObject.has("daily")){ JSONObject dailyObject = jsonObject.getJSONObject("daily"); // 检查data数组是否存在且不为空 if(dailyObject.has("data") && !dailyObject.isNull("data")){ JSONArray jsonArray = dailyObject.getJSONArray("data"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject data = jsonArray.getJSONObject(i); // 检查summary字段是否存在 if(data.has("summary")){ String summary = data.getString("summary"); tvSummary.append(summary); } } } } } catch (JSONException e) { e.printStackTrace(); } }
这样就算JSON里某些字段偶尔缺失,你的应用也不会轻易出问题啦~
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

