1

我是 JSON 新手。我正在使用http://pnrapi.appspot.com/使用 JSON 获取特定火车的状态。但是在尝试解析接收到的对象时,我总是得到一个空指针异常。请帮忙。

这是我的代码。

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创建一个字节数组,例如 (example)...

    byte[] buffer = new byte[contentLength]并简单地阅读InputStream为...

    inStream.read(buffer). 当然,您需要在此过程中进行错误检查。在您的情况下,您尝试逐行读取字符串并将“n”附加到每一行。首先,您不需要以这种方式读取 JSON 字符串,如果您实际上打算附加换行符(在任何 Java 代码中的任何时间),它应该是“\n”。

  3. 要将您的字节数组转换为可用于 JSON 解析的字符串,您只需执行以下操作...

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

  4. iso-8859-1如果你真的可以避免它,永远不要为任何东西指定编码。

  5. 当你Toast在你的Activity onCreate(...)方法中创建你的时,你使用getApplicationContext(). 不要使用应用程序上下文,除非您真的确定应该在何时何地使用它。在代码的主体中,Activity's您可以thisContext创建Toast.

  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。

因此,您可以通过检查返回的对象是否为空来处理这种情况。

将您的代码更改为以下

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

使用get而不是getString作为:

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 回答