简体   繁体   中英

I am getting Error parsing data org.json.JSONException

I am getting this error in my LogCat:

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

Below are every file I could show you! Please let me know the problem and its solution ASAP. What I guess is: 1. Maybe the is problem is with parsing data in JSON array. 2. Maybe the problem is with my php api, I think I am not properly encoding the json_encode because it gives me RAW JSON, like every thing in one line.

as below

[{"uid":"120","name":"MyFirstName MyLastName"}]

Please also let me know, their is some difference in working of both format, 1. Raw JSON and 2. Intented Json

below is the intented json format

[
    {
    "uid":"120",
    "name":"MyFirstName MyLastName"
    }
]

Here is the JSONUseActivity.java

package com.example.oncemore;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;

import com.example.oncemore.CustomHttpClient;

import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class JSONUseActivity extends Activity {

EditText email,password; 
Button submit;
TextView tv; // TextView to show the result of MySQL query
String returnString; // to store the result of MySQL query after decoding
// JSON
/** Called when the activity is first created. */
@Override

public void onCreate(Bundle savedInstanceState) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads().detectDiskWrites().detectNetwork() // StrictMode is
            // most commonly
            // used to catch
            // accidental
            // disk or
            // network
            // access on the
            // application's
            // main thread
            .penaltyLog().build());
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_jsonuse);

    email = (EditText) findViewById(R.id.email);
    password = (EditText) findViewById(R.id.password);
    submit = (Button) findViewById(R.id.submitbutton);
    tv = (TextView) findViewById(R.id.showresult);

    // define the action when user clicks on submit button
    submit.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // declare parameters that are passed to PHP script i.e. the
            ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
            // define the parameter
            postParameters.add(new BasicNameValuePair("email",email.getText().toString()));
            postParameters.add(new BasicNameValuePair("password",password.getText().toString()));
            String response = null;
            // call executeHttpPost method passing necessary parameters
            try {
                response = CustomHttpClient.executeHttpPost(
                        "http://mywebsite.com/android/api.php",
                        postParameters);
                // store the result returned by PHP script that runs MySQL
                // query
                String result = response.toString();
                // parse json data
                try {
                    returnString = "";
    //I think the line below is creating some problem 
                    JSONArray jArray = new JSONArray(result);
                    for (int i = 0; i < jArray.length(); i++) {
                        JSONObject json_data = jArray.getJSONObject(i);
                        Log.i("log_tag",
                        "id: " + json_data.getInt("uid")+", name: " + json_data.getString("name"));
                        // Get an output to the screen
                        returnString += "\n" + json_data.getString("name")
                                + " -> " + json_data.getInt("uid");
                    }
                }catch (JSONException e) {
                    Log.e("log_tag", "Error parsing data " + e.toString());
                }
                try {
                    tv.setText(returnString);
                }
                catch (Exception e) {
                    Log.e("log_tag", "Error in Display!" + e.toString());
                    ;
                }
            }
            catch (Exception e) {
                Log.e("log_tag",
                        "Error in http connection!!" + e.toString());
            }
        }
    });
}

}

Here is the CustomHttpClient.java

package com.example.oncemore;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import android.util.Log;

public class CustomHttpClient {
 /** The time it takes for our client to timeout */
 public static final int HTTP_TIMEOUT = 30 * 1000; // milliseconds
 /** Single instance of our HttpClient */
 private static HttpClient mHttpClient;
 /**
  * Get our single instance of our HttpClient object.
  * 
  * @return an HttpClient object with connection parameters set
  */
 private static HttpClient getHttpClient() {
  if (mHttpClient == null) {
   mHttpClient = new DefaultHttpClient();
   final HttpParams params = mHttpClient.getParams();
   HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT);
   HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT);
   ConnManagerParams.setTimeout(params, HTTP_TIMEOUT);
  }
  return mHttpClient;
 }
 /**
  * Performs an HTTP Post request to the specified url with the specified
  * parameters.
  * 
  * @param url
  *            The web address to post the request to
  * @param postParameters
  *            The parameters to send via the request
  * @return The result of the request
  * @throws Exception
  */
 public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpPost request = new HttpPost(url);
   UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
   request.setEntity(formEntity);
   HttpResponse response = client.execute(request);
   in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in.readLine()) != null) {
    sb.append(line + NL);
   }
   in.close();
   String result = sb.toString();
   return result;
  } finally {
   if (in != null) {
    try {
     in.close();
    } catch (IOException e) {
     Log.e("log_tag", "Error converting result "+e.toString()); 
     e.printStackTrace();
    }
   }
  }
 }
 /**
  * Performs an HTTP GET request to the specified url.
  * 
  * @param url
  *            The web address to post the request to
  * @return The result of the request
  * @throws Exception
  */
 public static String executeHttpGet(String url) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpGet request = new HttpGet();
   request.setURI(new URI(url));
   HttpResponse response = client.execute(request);
   in = new BufferedReader(new InputStreamReader(response.getEntity()
     .getContent()));
   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in.readLine()) != null) {
    sb.append(line + NL);
   }
   in.close();
   String result = sb.toString();
   return result;
  } finally {
   if (in != null) {
    try {
     in.close();
    } catch (IOException e) {
     Log.e("log_tag", "Error converting result "+e.toString()); 
     e.printStackTrace();
    }
   }
  }
 }
}

Here is the api.php

<?php
require_once("../contactdb.php");
$myusername=$_REQUEST["email"]; 
$mypassword=$_REQUEST["password"]; 
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT uid,name FROM u_info WHERE email='".$myusername."' AND password ='".$mypassword."'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
if($count==1){
    while($row=mysql_fetch_assoc($result))
    $output[]=$row;
    echo json_encode($output);
    mysql_close();
}else{
    echo "Error Occured!";
}
?>

Finally, When I goto browser and write like this

http://mywebsite.com/android/api.php?email=myname@yahoo.com&password=1234

I got this json array!

[{"uid":"120","name":"MyFirstName MyLastName"}]

So Far I google, I have found different formats of json array! I found everywhere Intented Json. My json array is currently in Raw Json format. I don't find anywhere how to convert Raw Json format into Intented Json format.

Thanks in advance guys! Any help would be appreciated! If possible, please provide the correct code!

That is NOT valid JSON syntax:

{
    "employees": [
        { "firstName":"John" , "lastName":"Doe" },
        { "firstName":"Anna" , "lastName":"Smith" },
        { "firstName":"Peter" , "lastName":"Jones" }
    ]
}

Is Valid.

Note: This is also valid:

{"employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }

The syntax structure is the important part, not the formatting in terms of indentation.

As otherwise said, to use the fomat you're returning, you need to cut the substring from the response, ie get rid of the square brackets surrounding the braces.

In PHP I create a proper json response as follows:

// array for JSON response
$response = array();
$response["apps"] = array();

$apps = array();

$apps["name"] = $row["name"];
$apps["package"] = $row["package"];
$apps["version"] = $row["version"];
$apps["dateversion"] = $row["dateversion"];

array_push($response["apps"], $apps);

$response["success"] = 1;

echo json_encode($response);

This basically gives

{ "success":"1", "apps":{["name":"NAME", "package":"PACKAGE", "version":"VERSION", "dateversion":"DATEVERSION"]}}

which can be parsed correctly by any of the abundant examples of JSON classes which you can make use of. Hacking and using substring to manually remove the first N characters is NOT good practice...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM