1

我在我的 LogCat 中收到此错误:

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

以下是我可以向您展示的所有文件!请尽快让我知道问题及其解决方案。我猜是: 1. 可能问题在于解析 JSON 数组中的数据。2.也许问题出在我的php api上,我认为我没有正确编码json_encode,因为它给了我RAW JSON,就像一行中的每一件事一样。

如下

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

也请告诉我,它们在两种格式的工作方式上有所不同,1. Raw JSON 和 2. Intented Json

下面是有意的json格式

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

这是 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());
            }
        }
    });
}

}

这是 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();
    }
   }
  }
 }
}

这是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!";
}
?>

最后,当我进入浏览器并这样写时

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

我得到了这个 json 数组!

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

到目前为止,我在谷歌上发现了不同格式的 json 数组!我到处都找到了 Intented Json。我的 json 数组目前是 Raw Json 格式。我在任何地方都找不到如何将 Raw Json 格式转换为 Intented Json 格式。

提前谢谢各位!任何帮助,将不胜感激!如果可能,请提供正确的代码!

4

1 回答 1

1

这不是有效的 JSON 语法:

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

已验证。

注意:这也是有效的:

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

语法结构是重要的部分,而不是缩进方面的格式。

如另外所说,要使用您返回的格式,您需要从响应中删除子字符串,即去掉大括号周围的方括号。

在 PHP 中,我创建了一个正确的 json 响应,如下所示:

// 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);

这基本上给出了

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

您可以使用任何丰富的 JSON 类示例来正确解析它。破解和使用子字符串手动删除前 N 个字符不是好的做法......

于 2013-08-09T14:12:58.017 回答