Flutter调用维基百科API时如何从键为动态pageid的JSON中提取值
Flutter解析动态键JSON数据解决方案
核心修改点
- 修正维基API请求方式:当前你使用POST请求传空body访问维基API,该接口仅需GET请求即可正常返回数据,优先修改请求调用逻辑。
- 动态pageid解析逻辑:
query.pages返回的是键为动态pageid的Map结构,无需提前知道键名,直接取Map的values集合的首个元素即可获取页面对象,再读取description字段即可。
完整修改后代码片段
var transurl = Uri.parse( 'https://translation.googleapis.com/language/translate/v2?key=AIzaSyCZ**YCKlw'); var response = await http.post(transurl, body: {'q': sonuc, 'source': 'en', 'target': 'tr', 'format': 'text'}); if (response.statusCode == 200) { var harita = jsonDecode(utf8.decode(response.bodyBytes)) as Map; var ceviri = harita['data']['translations'].last['translatedText']; print(ceviri); var wikiurl = Uri.parse( 'https://tr.wikipedia.org/w/api.php?action=query&prop=description&format=json&titles=$ceviri'); // POST改为GET,删除多余的空body参数 var wikii = await http.get(wikiurl); // 打印返回体方便调试 print(wikii.body); var wikibilgi = jsonDecode(utf8.decode(wikii.bodyBytes)) as Map; var pagesMap = wikibilgi['query']['pages'] as Map; // 预设默认值,兼容无数据场景 String wikiii = "暂无对应词条描述"; // 非空判断避免异常崩溃 if (pagesMap.isNotEmpty) { var pageData = pagesMap.values.first; wikiii = pageData['description'] ?? wikiii; } print(wikiii); Navigator.push( context, MaterialPageRoute( builder: (context) => BilgiEkrani(sonuc: sonuc, oran: oran, wikibilgi: wikiii))); } else { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text("GOOGLE TRANSLATE API HATASI"), duration: const Duration(seconds: 2))); }
如果查询的词条不存在,pages下会返回带missing字段的对象,你可以根据业务需求再加额外判断逻辑处理该场景。
内容的提问来源于stack exchange,提问作者CidQu
相关产品推荐
相关产品推荐

