通过PHP文件获取JSON时,JSONArray无法转换为JSONObject错误
我知道这里也存在同样的问题,但我认为我的情况不同,我觉得这很令人困惑。当我的JSON链接是通过PHP文件获取JSON时,JSONArray无法转换为JSONObject错误,php,android,json,parsing,Php,Android,Json,Parsing,我知道这里也存在同样的问题,但我认为我的情况不同,我觉得这很令人困惑。当我的JSON链接是private static String url=”时,我会遇到这个错误http://10.0.2.2/shareity/test.php/";。但是当我在一个文本文件private static String url=”中有完全相同的JSON数据时http://10.0.2.2/shareity/json.txt";它工作得很好。我的问题是,当我只从PHP文件本身获取JSON时,为什么会发生这种情况 我
private static String url=”时,我会遇到这个错误http://10.0.2.2/shareity/test.php/";代码>。但是当我在一个文本文件private static String url=”中有完全相同的JSON数据时http://10.0.2.2/shareity/json.txt";代码>它工作得很好。我的问题是,当我只从PHP文件本身获取JSON时,为什么会发生这种情况
我的日志:
03-30 09:31:01.250: E/JSON Parser(3129): Error parsing data org.json.JSONException: Value [{"eid":"1","ename":"First","edesc":"Chirath"}, {"eid":"2","ename":"New one","edesc":"Checking if tiisssf"}, {"eid":"3","ename":"Blood Donation","edesc":"Giv the blud"}, {"eid":"4","ename":"Clean","edesc":"cleant eh thin g"}] of type org.json.JSONArray cannot be converted to JSONObject
03-30 09:31:01.260: W/EGL_emulation(3129): eglSurfaceAttrib not implemented
03-30 09:31:01.260: W/OpenGLRenderer(3129): Failed to set EGL_SWAP_BEHAVIOR on surface 0x7ff0079d5140, error=EGL_SUCCESS
03-30 09:31:01.310: D/AndroidRuntime(3129): Shutting down VM
03-30 09:31:01.310: E/AndroidRuntime(3129): FATAL EXCEPTION: main
03-30 09:31:01.310: E/AndroidRuntime(3129): Process: learn2crack.listview, PID: 3129
03-30 09:31:01.310: E/AndroidRuntime(3129): java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONArray org.json.JSONObject.getJSONArray(java.lang.String)' on a null object reference
03-30 09:31:01.310: E/AndroidRuntime(3129): at learn2crack.listview.MainActivity$JSONParse.onPostExecute(MainActivity.java:108)
03-30 09:31:01.310: E/AndroidRuntime(3129): at learn2crack.listview.MainActivity$JSONParse.onPostExecute(MainActivity.java:1)
03-30 09:31:01.310: E/AndroidRuntime(3129): at android.os.AsyncTask.finish(AsyncTask.java:632)
03-30 09:31:01.310: E/AndroidRuntime(3129): at android.os.AsyncTask.access$600(AsyncTask.java:177)
03-30 09:31:01.310: E/AndroidRuntime(3129): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
03-30 09:31:01.310: E/AndroidRuntime(3129): at android.os.Handler.dispatchMessage(Handler.java:102)
03-30 09:31:01.310: E/AndroidRuntime(3129): at android.os.Looper.loop(Looper.java:135)
03-30 09:31:01.310: E/AndroidRuntime(3129): at android.app.ActivityThread.main(ActivityThread.java:5221)
03-30 09:31:01.310: E/AndroidRuntime(3129): at java.lang.reflect.Method.invoke(Native Method)
03-30 09:31:01.310: E/AndroidRuntime(3129): at java.lang.reflect.Method.invoke(Method.java:372)
03-30 09:31:01.310: E/AndroidRuntime(3129): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-30 09:31:01.310: E/AndroidRuntime(3129): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
这是我的主要活动
public class MainActivity extends Activity {
ListView list;
TextView eid;
TextView ename;
TextView edesc;
Button Btngetdata;
ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
//URL to get JSON Array
private static String url = "http://10.0.2.2/shareity/test.php/";
//JSON Node Names
private static final String TAG_OS = "events";
private static final String TAG_EID = "eid";
private static final String TAG_ENAME = "ename";
private static final String TAG_EDESC = "edesc";
JSONArray events = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oslist = new ArrayList<HashMap<String, String>>();
Btngetdata = (Button)findViewById(R.id.getdata);
Btngetdata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new JSONParse().execute();
}
});
}
private class JSONParse extends AsyncTask<String, String, JSONObject> {
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
eid = (TextView)findViewById(R.id.vers);
ename = (TextView)findViewById(R.id.name);
edesc = (TextView)findViewById(R.id.api);
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Getting Data ...");
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(url);
return json;
}
@Override
protected void onPostExecute(JSONObject json) {
pDialog.dismiss();
try {
// Getting JSON Array from URL
events = json.getJSONArray(TAG_OS);
for(int i = 0; i < events.length(); i++){
JSONObject c = events.getJSONObject(i);
// Storing JSON item in a Variable
String eid = c.getString(TAG_EID);
String ename = c.getString(TAG_ENAME);
String edesc = c.getString(TAG_EDESC);
// Adding value HashMap key => value
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_EID, eid);
map.put(TAG_ENAME, ename);
map.put(TAG_EDESC, edesc);
oslist.add(map);
list=(ListView)findViewById(R.id.list);
ListAdapter adapter = new SimpleAdapter(MainActivity.this, oslist,
R.layout.list_v,
new String[] { TAG_EID,TAG_ENAME, TAG_EDESC }, new int[] {
R.id.vers,R.id.name, R.id.api});
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "You Clicked at "+oslist.get(+position).get("name"), Toast.LENGTH_SHORT).show();
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
试试这个,它会有用的
将以下内容放在php代码的顶部
header('Content-Type: application/json');
首先关闭mysql连接而不是fclose(我不确定)
您可以从字符串创建jsonObject,但是这个字符串是jsonarray
JSONArray jsonArray = new JSONArray(yourJSONString);
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
}
JSONArray-JSONArray=newjsonarray(yourJSONString);
for(int i=0;i
显然,请学习如何使用谷歌…@Selvin,我知道如何使用谷歌。这就是为什么我在问题的开头提到,我相信我的案例与其他案例不同。问题在于我的PHP代码。不是安卓。谢谢你的帮助,顺便说一句:)哈哈。。。你甚至不明白其他的问题。。。替换JSONObject jObj=新的JSONObject(json)
withJSONArray jObj=新的JSONArray(json)也应该做到这一点。。。基本上,你只是复制粘贴一些代码而不理解它。。。这不是编程哦,是吗?我不知道。我是自学型安卓,而且我是个新手。请不要嘲笑我。我很确定你在某个时候是这样的,它可能有用?这不是这个错误的原因…我希望你的答案,谢谢,伙计,从字符串形成json,它必须是有效的json,这里OP没有发布从php收到的确切json。当然没有。。。org.json.JSONException:Value[{“eid”:“1”,“ename”:“First”,“edesc”:“Chirath”},{“eid”:“2”,“ename”:“New one”,“edesc”:“Checking if tiisssf”},{“eid”:“Blood exection”,“edesc”:“Giv the blud”},{“eid”:“4”,“ename”:“Clean”,“edesc”:“cleant eh thin g”}类型org.json.JSONArray无法转换为JSONObject。。。这里是$json_response=array()。。。echo json_编码($json_响应)@塞尔文,我现在明白了。在PHP代码中,缺少{“events”:
。我如何获得它?我应该向PHP代码中添加什么代码?请帮助我,我对所有这些都是新手:(我已经在PHP部分更正了您的代码,echo json_encode(array('events'=>$json_response));
header('Content-Type: application/json');
mysql_close();
echo json_encode(array('events'=>$json_response));
JSONArray jsonArray = new JSONArray(yourJSONString);
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
}