Android parssing JSONException:JSONArray文本必须在字符1处以“[”开头

Android parssing JSONException:JSONArray文本必须在字符1处以“[”开头,android,mysql,Android,Mysql,我正在尝试将Android应用程序连接到本地MySQL数据库,但我在中遇到了一个问题 解析JSON数组。我在这里阅读了所有类似的问题,但没有任何效果 错误消息: Error parsing data org.json.JSONException: A JSONArray text must start with '[' at character 1 of [{"UserName":"Admin","Password":"111","Role":"0"},{"UserName":"Employee

我正在尝试将Android应用程序连接到本地MySQL数据库,但我在中遇到了一个问题 解析JSON数组。我在这里阅读了所有类似的问题,但没有任何效果

错误消息:

Error parsing data org.json.JSONException: A JSONArray text must start with '[' at character 1 of [{"UserName":"Admin","Password":"111","Role":"0"},{"UserName":"Employee","Password":"123","Role":"1"}] 
代码如下:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    new Connect().execute();
}

private class Connect extends AsyncTask<Void, Void, String> {
    private String result = "";
    private InputStream is = null;
    private ProgressBar progress_Bar;

    protected void onPreExecute() {
        progress_Bar = ((ProgressBar) findViewById(R.id.progress));
        progress_Bar.setVisibility(0);
    }

    @Override
    protected String doInBackground(Void... params) {
        try {
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://10.0.2.2/users.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }

        // convert response to string
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            is.close();
            result = sb.toString();
            result.trim();

        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        return result;
    }

    protected void onPostExecute(String result) {
        String name;

        try {
            Log.d("RESULT", result);

            JSONArray jArray = new JSONArray(result);
            JSONObject json_data = null;
            for (int i = 0; i < jArray.length(); i++) {
                json_data = jArray.getJSONObject(i);

                Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show();
            }
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }
    }
}
这是PHP代码:

<?php
$con1=mysql_connect("localhost", "root", "");

mysql_select_db("sehaty");
mysql_query("SET NAMES utf8"); 

$sql = mysql_query("SELECT * FROM users");
while($row = mysql_fetch_assoc($sql)) {
    $output[]=$row;
}
$data = json_encode($output);
print($data);
mysql_close();
?>

您发布的json是有效的。ISU可能与您从输入流读取的方式有关

试试这个

try{
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
    sb.append(line);
    }


尝试使用我的部分代码:

//执行HTTP Post请求

HttpResponse response=httpclient.executehtppost; HttpEntity=response.getEntity; is=entity.getContent

BufferedReader reader=新BufferedReadernew InputStreamReaders,iso-8859-1,8; StringBuilder sb=新的StringBuilder

字符串行=null; 而line=reader.readLine!=null{ sb.appendline+\n; }

接近; 结果=sb.toString

JSONArray jArray=新的JSONArrayresult; JSONObject json_data=新的JSONObject

forint i=0;i试试这个:

请求代码中的第一个:

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            response.getEntity().writeTo(out);
            out.close();
            result = out.toString();
和int解析:

        JSONArray jArray = new JSONArray(result);
        JSONObject json_data = null;
        String s = "";
        for (int i = 0; i < jArray.length(); i++) {
            s = jArray.get(i).toString();
            json_data = new JSONObject(s);

            Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show();
        }
    JSONObject json = new JSONObject(result);
    JSONArray jArray = json.getJSONArray("result");
    JSONObject json_data = null;
    String s = "";
    for (int i = 0; i < jArray.length(); i++) {
        s = jArray.get(i).toString();
        json_data = new JSONObject(s);

        Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show();
    }
尝试将结果JSON设置为{result:[{用户名:Admin,密码:111,角色:0},{用户名:Employee‌​,帕斯沃‌​rd:123,角色:1},{UserName:x,Password:x,Role:-1}]}并且在解析中:

        JSONArray jArray = new JSONArray(result);
        JSONObject json_data = null;
        String s = "";
        for (int i = 0; i < jArray.length(); i++) {
            s = jArray.get(i).toString();
            json_data = new JSONObject(s);

            Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show();
        }
    JSONObject json = new JSONObject(result);
    JSONArray jArray = json.getJSONArray("result");
    JSONObject json_data = null;
    String s = "";
    for (int i = 0; i < jArray.length(); i++) {
        s = jArray.get(i).toString();
        json_data = new JSONObject(s);

        Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show();
    }

可能您的数据无效,因为存在前导/尾随空格/换行符/

我会在onPostExcecute中预处理结果,如下所示:

private final static String TAG = "YourApplication";

public static String asHex(String str)
{
    byte[] buf = str.getBytes();
    final char[] HEX_CHARS = "0123456789abcdef".toCharArray();
    char[] chars = new char[2 * buf.length];
    for (int i = 0; i < buf.length; ++i)
    {
        chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
        chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
    }
    return new String(chars);
}

protected void onPostExecute(String result) {
    try {
        result = result.replaceAll("[\n\t]", "").replaceAll("[^ A-Za-z0-9\",\[\]{}]", "").trim();
        Log.d(TAG, "RESULT: #" + result + "#");
        Log.d(TAG, "RESULT: " + asHex(result));

        JSONArray jArray = new JSONArray(result);
        for (int i = 0; i < jArray.length(); i++) {
            Log.d(TAG, "USERS: " + jArray.getJSONObject(i).toString());
        }
    } catch (JSONException e) {
        Log.e(TAG, "ERROR: " + e.toString());
    }
}

这也不起作用!!!!!我尝试了不同的解决方案,但得到了相同的错误。谢谢,但不幸的是,它不起作用!!!我认为这是不可预测的错误。。请确保结果字符串在JSON中定义良好。这是字符串结果,它是有效的Josn数组。[{用户名:Admin,密码:111,角色:0},{UserName:Employee,Password:123,Role:1},{UserName:x,Password:x,Role:-1}]尝试更改为以下内容:{result:[{UserName:Admin,Password:111,Role:0},{UserName:Employee,Passwo‌​rd:123,角色:1},{用户名:x,密码:x,角色:-1}]}和我的答案中的解析一样。你仍然得到相同的错误吗?是的,你有什么建议吗?嗯…我添加了一个小的十六进制转换器。也许你可以给我们看代码的logcat输出?特别是带有结果的行:…会很有趣。我使用了版本4的模拟器…我认为这没有意义,但应用程序工作了…谢谢.