如何从android中的json对象异步中获取整数?

时间:2014-03-06 10:27:47

标签: android json asynchronous

原始问题 -

我正在关注android中的json教程,但是在android中使用Async获取json值有问题。首先,我创建了jsonparser类并添加了以下内容 -

    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;
}

然后通过我试过的async在片段中使用它 -

    class getTopicId extends AsyncTask<String, String, JSONObject> {
    private ProgressDialog pDialog;
    @Override
      protected void onPreExecute() {
          super.onPreExecute();
          pDialog = new ProgressDialog(getActivity());
          pDialog.setMessage("Getting Topic of the Day ...");
          pDialog.setIndeterminate(false);
          pDialog.setCancelable(true);
          pDialog.show();
    }
    @Override
      protected JSONObject doInBackground(String... args) {
      JSONParser jParser = new JSONParser();
      // Getting JSON from URL
      JSONObject json = jParser.getJSONFromUrl("http://medicalguru.in/android/tod.php");
      return json;
    }
     @Override
       protected void onPostExecute(JSONObject json) {
       pDialog.dismiss();
       try {
           topic_id = json.getInt("value");    
      } 
       catch (JSONException e) {
        e.printStackTrace();
      }
       finally {
           Toast.makeText(getActivity(), "topic id -"+topic_id, Toast.LENGTH_LONG).show();
       }
     }
}

但是当我执行此异步时,应用程序崩溃了。 我的logcat显示 -

03-06 15:07:03.123: E/AndroidRuntime(2041): FATAL EXCEPTION: main
03-06 15:07:03.123: E/AndroidRuntime(2041): java.lang.NullPointerException
03-06 15:07:03.123: E/AndroidRuntime(2041):     at in.medicalguru.DailyTestFragment$getTopicId.onPostExecute(DailyTestFragment.java:786)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at in.medicalguru.DailyTestFragment$getTopicId.onPostExecute(DailyTestFragment.java:1)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at android.os.AsyncTask.finish(AsyncTask.java:631)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at android.os.Looper.loop(Looper.java:137)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at android.app.ActivityThread.main(ActivityThread.java:5103)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at java.lang.reflect.Method.invokeNative(Native Method)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at java.lang.reflect.Method.invoke(Method.java:525)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-06 15:07:03.123: E/AndroidRuntime(2041):     at dalvik.system.NativeStart.main(Native Method)

上面在代码中提到的链接输出为 -

{"value":1}

正常打开时,但是当我在异步中运行时,它说错误与nullpointer有关吗? 无法想象,我在哪里弄错了?


编辑1: * tod.php *代码(因为Matthew指出了一些我不理解的东西,所以它可能会有所帮助)

<?php
$today = date("Ymd");
switch($today){
case 20140304 :
$tod["value"] = 24;
break;
case 20140305 :
$tod["value"] = 25;
break;
case 20140306 :
$tod["value"] = 1;
break;
default:
$tod["value"] = 1;
break;
}
echo json_encode($tod);
?>

编辑2: * 发现问题(完全适合我)但部分真实 * - 特别感谢Matthew的想法,取消注释错误日志function getJSONFromUrl(String url)。我在logcat中得到了一个新的错误行 -

Error parsing data org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject

在google和stacksoverflow上进行了一些搜索之后,我发现了一个建议将chrSet更改为UTF-8而不是iso-8859-1 。并且它适用于我在两种情况下请求的URL(有或没有WWW - 建议由nikis进行测试)。但这个答案是部分真实的,因为现在已经提出了两个未解决的问题 - 1. 为什么chrSet更改有效?将来,要使用什么chrSet来避免这个问题,以及其他chrSet的用途是什么? 马修已将我的Json复制到他的服务器mwesly.com/test/。在他的服务器上试用,logcat在所有情况下显示以下错误(有或没有WWW,最后有或没有使用index.php) -

Error parsing data org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject

现在,为什么这个错误出现在他的服务器上?应采取哪些措施来防止/处理此错误。 如果我需要单独询问这些更新的问题,请告诉我。

3 个答案:

答案 0 :(得分:1)

在下一行看起来json为null,这会给你NullPointerException。

topic_id = json.getInt("value");

我认为这是因为你的解析器有问题解析json。我写了一个快速的python脚本,并试图解析页面,它也失败了。出于某种原因,我从http://medicalguru.in/android/tod.php得到的回复是:

\xef\xbb\xbf{"value":1}

我不确定为什么\ xef \ xbb \ xbf字节存在,但它们可能会导致问题。

编辑:快速谷歌搜索称它是UTF-8 BOM。如果你删除它你的Android代码应该工作。

edit2:我在http://mwesly.com/test上放了一个例子json。尝试点击json,看看你的android代码是否正确。如果它有效,则表示您的端点存在问题,而不是您的Android代码。

edit3:使用loopj的例子:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://mwesly.com/test", null, new JsonHttpResponseHandler() {
    @Override
    public void onSuccess(JSONObject json) {
        // do something with the json
        int value = json.getInt("value");
    }
});

我要去睡觉,如果你醒来时还没有解决这个问题,我会再看看。祝你好运,编码愉快!

答案 1 :(得分:0)

尝试使用以下getJSONFromUrl方法:

public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        HttpResponse httpResponse = httpClient.execute(httpPost);
        return new JSONObject(EntityUtils.toString(httpResponse.getEntity()));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

答案 2 :(得分:0)

private JSONObject jObj = null;
private JSONArray JArr = null;

然后之后;

        URL url = null;
        try {
            url = new URL("your url is here");
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        JSONParser jParser = new JSONParser();
        String json_value = jParser.getJSONFromUrl(url);
    try {
              JArr = new JSONArray(json_value);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            jObj = null;

            for (int i = 0; i < JArr.length(); i++) {
                try {
                    jObj = JArr.getJSONObject(i);
                    topic_id = jObj.getInt("value");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }