创建JSON数组时出现org.json.JSON.typeMismatch(JSON.java:111)错误求助
问题原因分析
你遇到的org.json.JSON.typeMismatch错误,核心问题是你把整个JSON响应对象直接当成JSON数组来解析了。
先看你收到的返回数据:
{ "result":[ { "@type":"d", "@rid":"#-2:0", "@version":0, "a_adres":"kepez merkez geliyor herkez", "takipkodu":"464664", "agirlik":50 }, { "@type":"d", "@rid":"#-2:1", "@version":0, "a_adres":"merkez mahallesi 4 sok", "takipkodu":"sd4fs654f64", "agirlik":60 } ] }
最外层是一个用{}包裹的JSON对象,真正的数组是这个对象里的result字段。但你的代码里直接用new JSONArray(getResponse)尝试解析整个响应,这就触发了类型不匹配异常——因为你试图把对象转换成数组。
修复后的代码
把onPostExecute方法里的解析逻辑修改成这样:
protected void onPostExecute(String getResponse) { ListView liste=(ListView)findViewById(R.id.list_view); try { // 第一步:先把响应字符串解析成最外层的JSONObject JSONObject responseRoot = new JSONObject(getResponse); // 第二步:从根对象中取出名为"result"的JSONArray JSONArray yukilanarray = responseRoot.getJSONArray("result"); List<Yukilan> yukilanlar = new ArrayList<>(); // 遍历数组处理每个元素 for (int i = 0; i<yukilanarray.length();i++){ Yukilan yeniilan = new Yukilan(); JSONObject yukilanobject = yukilanarray.getJSONObject(i); yeniilan.setAdres(yukilanobject.getString("a_adres")); // 注意:agirlik是数字类型,若Yukilan类接收String类型需转换,建议直接用Integer类型更合理 yeniilan.setAgirlik(String.valueOf(yukilanobject.getInt("agirlik"))); yeniilan.setTakip_kod(yukilanobject.getString("takipkodu")); yukilanlar.add(yeniilan); } // 设置ListView适配器 yukilanadapter = new Yukilanadapter(yukilanlar,getApplicationContext()); liste.setAdapter(yukilanadapter); } catch (JSONException e) { e.printStackTrace(); } }
额外提示
注意返回数据里的agirlik是数字类型(比如50、60),如果你的Yukilan类中agirlik字段是String类型,用String.valueOf()转换是可行的,但更建议把字段改成Integer类型,这样更贴合数据本身的类型,避免不必要的转换操作。
内容的提问来源于stack exchange,提问作者otherid
相关产品推荐
相关产品推荐

