1

私はJSONが初めてです。http://pnrapi.appspot.com/を使用して、JSON を使用して特定の列車のステータスを取得しています。しかし、受信したオブジェクトを解析しようとすると、常に null ポインター例外が発生します。助けてください。

これが私のコードです。

public class PNRStatusActivity extends Activity {
    private static final String TAG_CONTACTS = "contacts";
    static InputStream is = null;
    JSONObject jObj = null;
    static String json = "";
    JSONArray contacts = null;
    private static String url = "http://pnrapi.appspot.com/4051234567";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // Creating JSON Parser instance
        JSONObject jon=getJSONFromUrl(url);

        try {
            // Storing each json item in variable
            String id = jon.getString("status");
            Toast.makeText(getApplicationContext(), id, Toast.LENGTH_LONG).show();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //function to get JSON Object
    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;
    }
}
4

3 に答える 3

3

コードには多くの問題がありますが、必ずしもすべてが直接関連しているとは限りませんNullPointerException...

  1. あなたのgetJSONFromUrl方法HttpPostでは、実際に何かを投稿しているようには見えないときに使用しています。HttpGet代わりに使用してください。

  2. 応答からJSON文字列を読み取るときは、のgetContentLength()メソッドを使用HttpEntityして(例)などのバイト配列を作成します。

    byte[] buffer = new byte[contentLength]そして単にInputStreamとして読んでください...

    inStream.read(buffer)。もちろん、途中でエラーチェックを行う必要があります。あなたの場合、文字列を1行ずつ読み取り、各行に「n」を追加しようとしています。まず、この方法でJSON文字列を読み取る必要はありません。実際に改行文字を追加する場合は(任意のJavaコードでいつでも)、「\n」にする必要があります。

  3. バイト配列をJSON解析に使用できる文字列に変換するには、次のようにします...

    String jsonString = new String(buffer, "UTF-8")

  4. iso-8859-1本当に回避できる場合は、エンコードを指定しないでください。

  5. メソッドでを作成するときは、を使用Toastします。いつどこで使用すべきか本当に確信が持てない限り、アプリケーションコンテキストを使用しないでください。コードの本体では、を作成するときに簡単に使用できます。Activity onCreate(...)getApplicationContext()Activity'sthisContextToast

  6. null他の人が述べているように、彼らが起こる可能性のあるすべての場所で返品を確認するようにしてください。メソッドで例外が発生し、nullそのメソッドが呼び出されたコードが。をチェックすることを確認してnullください。

于 2012-06-17T09:32:12.913 に答える
1

コードを注意深く見てください

    try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

上記の場合、JSONException を取得すると、初期化されていない jObj が返されます。つまり、null jObj が返されます。

そのため、返されたオブジェクトが null かどうかを確認することで、その状況を処理できます。

コードを次のように変更します

if (jon != null)
{
    String id = jon.getString("status");
    Toast.makeText(getApplicationContext(), id, Toast.LENGTH_LONG).show();
}
于 2012-06-17T08:27:44.880 に答える
1

次のようにgetStringの代わりにgetを使用します。

try {
    JSONObject jsona=new JSONObject("{'status': 'INVALID', 'data': 'No results'}");
    String id = (String)jsona.get("status");
    Toast.makeText(DfgdgdfgdfActivity.this, id, Toast.LENGTH_LONG).show();
} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

編集:

使用する

while ((line = reader.readLine()) != null) {
                sb.append(line);
            }

それ以外の

while ((line = reader.readLine()) != null) {
                sb.append(line + "n");
            }
于 2012-06-17T08:28:30.160 に答える