Android parssing JSONException:JSONArray文本必须在字符1处以“[”开头
我正在尝试将Android应用程序连接到本地MySQL数据库,但我在中遇到了一个问题 解析JSON数组。我在这里阅读了所有类似的问题,但没有任何效果 错误消息: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
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,Password:123,角色:1},{用户名:x,密码:x,角色:-1}]}和我的答案中的解析一样。你仍然得到相同的错误吗?是的,你有什么建议吗?嗯…我添加了一个小的十六进制转换器。也许你可以给我们看代码的logcat输出?特别是带有结果的行:…会很有趣。我使用了版本4的模拟器…我认为这没有意义,但应用程序工作了…谢谢.