原始问题 -
我正在关注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
现在,为什么这个错误出现在他的服务器上?应采取哪些措施来防止/处理此错误。 如果我需要单独询问这些更新的问题,请告诉我。
答案 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();
}
}