1

Web サービスから json を解析しようとしていますが、nullpointer 例外が発生します。しかし、ブラウザでURLをヒットすると結果が得られますが、コードではnullが返されます。

ここに私の URL があります:- 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)   

私のコードで何が問題なのかわかりません。サーバーから null 値を取得している理由。
どなたか参考になさってください。
前もって感謝します

4

1 に答える 1

2

編集:

getJSONFromUrl(String str)からJSONObjectに返される型を変更 しJSONArrayます。

そして、このようにJSONArrayを直接作成します

JSONArray array=new JSONArray(json); // json はあなたの json 文字列です

getJSONFromUrl(String str)メソッドで配列を返す


JSONArray を返すサービス

上記の応答に基づいて、サービスは JSONObject ではなく JSONArray を返すため、JSONArray を JSONObject に変換しようとすると、JSONException もスローされます。

  JSONObject jsonObject = jsonParser.getJSONFromUrl(url);

したがって、これは null を返します。

あなたのjsonObjectがそうであるようにnull、あなたはここにアクセスしようとしています

dueDate = jsonObject.getString("duedate");

あなたは得るでしょうNullPointerException

于 2013-04-10T17:25:41.217 に答える