2013-04-10 161 views
1

我想从webservices解析json,但我得到了空指针异常。但是如果我在浏览器中点击url,那么我得到的结果,但在代码中它返回null。解析JSON时获取NullPointer异常

这里是我的网址: - http://www.expensekeeper.in/webservice/FetchBillCall.php?userid=7

这里是我的代码: -

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);  
    new LongOperation().execute(""); 

} 

private class LongOperation extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     String url = "http://www.expensekeeper.in/webservice/FetchBillCall.php?userid=7"; 
     JSONParser jsonParser = new JSONParser(); 
     JSONObject jsonObject = jsonParser.getJSONFromUrl(url); 
     try { 
      //JSONArray jsonArray = jsonObject.getJSONArray(""); 
      dueDate = jsonObject.getString("duedate"); 
      description = jsonObject.getString("description"); 
      status = jsonObject.getString("status"); 
      remarks = jsonObject.getString("remarks"); 
     } catch (JSONException e) { 
     e.printStackTrace(); 
     } 
      return "Executed"; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     Toast.makeText(MainActivity.this, dueDate+description+status+remarks, Toast.LENGTH_LONG).show(); 
    } 

    } 

这里是我jsonParser类: -

public JSONObject getJSONFromUrl(String str) { 

    HttpURLConnection conn = null; 
    StringBuilder jsonResults = new StringBuilder(); 
    try { 
     URL url = new URL(str); 
     conn = (HttpURLConnection) url.openConnection(); 
     InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

     // Load the results into a StringBuilder 
     int read; 
     char[] buff = new char[1024]; 
     while ((read = in.read(buff)) != -1) { 
      jsonResults.append(buff, 0, read); 
     } 
     json = jsonResults.toString(); 
    } catch (MalformedURLException e) { 
     Log.e(LOG_TAG, "Error processing Places API URL", e); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "Error connecting to Places API", e); 
    } finally { 
     if (conn != null) { 
      conn.disconnect(); 
     } 
    } 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 
    return jObj; 

} 

这里是我的堆栈跟踪: -

04-10 17:15:16.425: E/AndroidRuntime(1388): Caused by: java.lang.NullPointerException 
04-10 17:15:16.425: E/AndroidRuntime(1388):  at com.example.jsonsample.MainActivity$LongOperation.doInBackground(MainActivity.java:40) 
04-10 17:15:16.425: E/AndroidRuntime(1388):  at com.example.jsonsample.MainActivity$LongOperation.doInBackground(MainActivity.java:1) 

我不明白我的代码出了什么问题。为什么我从服务器获得空值。
请给我任何参考。
在此先感谢

+0

哪里'(MainActivity .java:40)'指向?对'dueDate = jsonObject.getString(“duedate”);'的 – asloob 2013-04-10 17:20:11

+0

。 – 2013-04-10 17:22:53

回答

2

编辑:从JSONObject通过getJSONFromUrl(String str)回到JSONArray

更改类型。

然后直接这样

JSONArray array=new JSONArray(json); // JSON创建JSONArray是您的JSON字符串在getJSONFromUrl(String str)方法

返回数组


根据您的服务返回JSONArray

上面的响应,你的服务返回JSONArray,而不是JSONObject,所以它也会抛出JSONExc eption,当您尝试将JSONArray转换为JSONObject时。

JSONObject jsonObject = jsonParser.getJSONFromUrl(url); 

因此,这将返回NULL,

为您的JSONObject是null和你正试图在这里

dueDate = jsonObject.getString("duedate"); 

访问它,你会得到NullPointerException

+0

你可以提供给我如何读取阵列没有任何名称...因为我的数组没有任何名称....你打这个url ... – 2013-04-10 17:28:42

+0

你可以直接创建JSONArray的字符串,像这样'JSONArray array = new JSONObject(jsonstring);'并返回JSON解析器中的JSONArray – Pragnani 2013-04-10 17:30:02

+0

@SandipArmalPatil检查我的编辑 – Pragnani 2013-04-10 17:34:09