通过PHP文件获取JSON时,无法将JSONArray转换为JSONObject错误


JSONArray cannot be converted to JSONObject error when getting JSON via PHP file

我知道这里也存在同样的问题,但我相信我的情况不同,我觉得很困惑。当我的JSON链接是private static String url = "http://10.0.2.2/shareity/test.php/";时,我会得到这个错误。但是,当我在文本文件private static String url = "http://10.0.2.2/shareity/json.txt";中有完全相同的JSON数据时,它可以完美地工作。我的问题是,当我只从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 API:

<?php
//Create Database connection
$db = mysql_connect("localhost","root","");
if (!$db) {
    die('Could not connect to db: ' . mysql_error());
}

//Select the Database
mysql_select_db("shareity",$db);

//Replace * in the query with the column names.
$result = mysql_query("select * from event2", $db); 

//Create an array
$json_response = array();

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $row_array['eid'] = $row['eid'];
    $row_array['ename'] = $row['ename'];
    $row_array['edesc'] = $row['edesc'];
    //$row_array['esdate'] = $row['esdate'];
    //$row_array['eedate'] = $row['eedate'];
    //$row_array['estime'] = $row['estime'];
    //$row_array['eetime'] = $row['eetime'];
    //$row_array['egoal'] = $row['egoal'];
    //$row_array['createdby'] = $row['createdby'];


    //push the values in the array
    array_push($json_response,$row_array);
}
echo json_encode($json_response);

//Close the database connection
fclose($db);

?>

这是我的JSONParser类:

public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public 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);
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "'n");
        }
        is.close();
        Log.d("JSON before to string: ", "> " + json);
        json = sb.toString();
        Log.d("JSON after to string: ", "> " + json);
    } 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);
        Log.d("JSONObject: ", "> " + jObj);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
    // return JSON String
    return jObj;
}
}

试试这个,它会起作用的将以下内容放在您的php代码的顶部

header('Content-Type: application/json');

并且首先关闭mysql连接而不是fclose(我不确定)

mysql_close();
echo json_encode(array('events'=>$json_response));

您从字符串创建jsonObject,但是这个字符串jsonaray

JSONArray jsonArray = new JSONArray(yourJSONString);
for(int i = 0; i < jsonArray.length(); i++) {
    JSONObject jsonObj = jsonArray.getJSONObject(i);
}