调用Wikipedia API遇JSON数字键转换问题:Integer无法转为JSONObject
解决Wikipedia API返回数字键的JSON解析问题
嘿,我看你在用AsyncTask调用Wikipedia API时卡在了JSON解析这一步——问题出在返回的JSON里有数字类型的页面ID作为键,而你的代码处理方式不对导致了类型不匹配错误。咱们来一步步捋清楚问题和解决办法:
你的代码核心错误点
先看你代码里的这段问题代码:
JSONObject part = new JSONObject(pageID); title = part.getString("title"); message = part.getString("extract");
这里的pageID是你从page.names().get(0)拿到的字符串(比如"13580374"),你直接拿这个字符串去创建JSONObject,这完全搞错了逻辑!这个字符串只是页面ID的字符串形式,本身并不是一个JSON对象,这就是为啥会抛出typeMismatch错误的原因。
另外你还有个小问题:String query = data.getString("query");——query是JSON对象,不是字符串,应该用getJSONObject来获取,不能直接转成字符串。
修正后的代码
直接用字符串形式的页面ID作为key,从pages对象里取对应的页面内容就好,JSONObject支持用字符串形式的数字键来取值,不管原始JSON里的键是数字还是字符串类型:
Log.i(Config.TAG, result); // 先把整个返回结果解析成JSON对象 JSONObject dataObj = new JSONObject(result); // 获取query对象 JSONObject queryObj = dataObj.getJSONObject("query"); // 获取pages对象 JSONObject pagesObj = queryObj.getJSONObject("pages"); // 获取第一个页面ID并转成字符串 String pageID = pagesObj.keys().next().toString(); // 用pageID作为key,拿到对应的页面内容对象 JSONObject pageContentObj = pagesObj.getJSONObject(pageID); String title = null; String message = null; // 判断是否是不存在页面的情况(pageID为-1) if (Integer.parseInt(pageID) == -1) { title = "No User found"; message = "It seems that this User does not have a Wikipedia Article yet."; } else { title = pageContentObj.getString("title"); message = pageContentObj.getString("extract"); }
额外提示
- 用
pagesObj.keys().next()获取第一个键比page.names().get(0)更符合现代Android JSON API的用法,而且转成字符串后直接就能用。 - 建议在JSON解析时加上
try-catch块,捕获JSONException,避免因为API返回结构临时变化导致App崩溃。 - 本质上,JSONObject内部会把所有键都存储为字符串,所以不管原始JSON里的键是数字还是字符串,只要你用对应的字符串形式去取值,就能正常拿到数据,不需要额外做复杂的类型转换。
内容的提问来源于stack exchange,提问作者Samuel M.
相关产品推荐
相关产品推荐

