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

调用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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:56