1. 程式人生 > >關於 json解析過程中的一個問題的解決

關於 json解析過程中的一個問題的解決

在編寫一個專案練手的時候,發現程式並沒有缺少資料,也沒有語法錯誤,部分程式如下:

private void initViewOper() {
// TODO Auto-generated method stub
//獲取當前天氣資訊,聚合資料裡查詢天氣資訊
//發get請求 用xutilsl來使用

String url = "http://v.juhe.cn/weather/index?cityname=北京&key=4f0400b15ffec0136daf3350cb408480";
hu.send(HttpMethod.GET, url, new RequestCallBack<String>() {


@Override
public void onFailure(HttpException arg0, String arg1) {
// TODO Auto-generated method stub
toast("獲取天氣資料失敗");
}


@Override
public void onSuccess(ResponseInfo<String> arg0) {
// TODO Auto-generated method stub
String result1 = arg0.result;
if(result1 != null && result1.startsWith("\ufeff"))  
{  
result1 =  result1.substring(1);  

String weather_content = parseJson(result1);
weather.setText(weather_content);
}
});
}
private String parseJson(String result) {
// TODO Auto-generated method stub
try {
JSONObject jo = new JSONObject(result);//最外層
JSONObject jo1 = jo.getJSONObject("result");
JSONObject jo2 = jo1.getJSONObject("today");
return jo2.getString("weather");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "多雲";
}

但是在執行過程中總是出現 一下錯誤:

07-19 11:19:16.180: W/System.err(587): org.json.JSONException: Value null at result of type org.json.JSONObject$1 cannot be converted to JSONObject
07-19 11:19:16.180: W/System.err(587): at org.json.JSON.typeMismatch(JSON.java:96)


07-19 11:19:16.180: W/System.err(587): at org.json.JSONObject.getJSONObject(JSONObject.java:573)
07-19 11:19:16.180: W/System.err(587): at com.example.secretsofmy.newSecret.parseJson(newSecret.java:66)
07-19 11:19:16.180: W/System.err(587): at com.example.secretsofmy.newSecret.access$0(newSecret.java:62)
07-19 11:19:16.180: W/System.err(587): at com.example.secretsofmy.newSecret$1.onSuccess(newSecret.java:57)
07-19 11:19:16.180: W/System.err(587): at com.lidroid.xutils.http.HttpHandler.onProgressUpdate(HttpHandler.java:218)
07-19 11:19:16.180: W/System.err(587): at com.lidroid.xutils.task.PriorityAsyncTask$InternalHandler.handleMessage(PriorityAsyncTask.java:385)
07-19 11:19:16.180: W/System.err(587): at android.os.Handler.dispatchMessage(Handler.java:99)
07-19 11:19:16.180: W/System.err(587): at android.os.Looper.loop(Looper.java:130)
07-19 11:19:16.180: W/System.err(587): at android.app.ActivityThread.main(ActivityThread.java:3683)
07-19 11:19:16.180: W/System.err(587): at java.lang.reflect.Method.invokeNative(Native Method)
07-19 11:19:16.180: W/System.err(587): at java.lang.reflect.Method.invoke(Method.java:507)
07-19 11:19:16.180: W/System.err(587): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-19 11:19:16.180: W/System.err(587): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-19 11:19:16.180: W/System.err(587): at dalvik.system.NativeStart.main(Native Method)

可以看出是 Json 解析出來了問題,導致無法解析得到的 result資料(result包含了json資料的所有子資料)

產生這種問題的原因是 漢字需要進行URL編碼:

String url = "http://v.juhe.cn/weather/index?cityname=北京&key=4f0400b15ffec0136daf3350cb408480";

改為url編碼

String url = "http://v.juhe.cn/weather/index?cityname="


+ URLEncoder.encode("北京")


+ "&key=4f0400b15ffec0136daf3350cb408480";

這樣解析過程就不會報轉換錯誤了。