我使用php将数据从服务器发送到我的android应用程序。代码在php中运行任何错误,但我在android应用程序中遇到了无法解析json的错误。我引出json并将其标记到http://json.parser.online.fr/它向我显示了SyntaxError:JSON中位于0位置的意外令牌错误这是我的php代码:
function selectAll($cnn)
{
$query="SELECT * FROM user";
$stmt=$cnn->prepare($query);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result[]=$row;
}
return $result;
}
echo(json_encode(array('result' => $arr)));
这是我用php 生成的json数据
当然这是我的安卓代码:
public class ManageUser extends AppCompatActivity implements RecyclerItemClickListener.OnItemClickListener {
RecyclerView recyclerView;
ProgressBar progressBar;
List<user> listOfUser=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_user);
progressBar=(ProgressBar)findViewById(R.id.UserProgress);
recyclerView=(RecyclerView)findViewById(R.id.recviewUser);
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this,this));
SelectAllUserNetworkTask GetAllUser=new SelectAllUserNetworkTask(this);
GetAllUser.execute();
}
@Override
public void onItemClick(View childView, int position) {
Toast.makeText(this,"Clicked trigger",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongPress(View childView, int position) {
Toast.makeText(this,"LongPress",Toast.LENGTH_SHORT).show();
}
public class SelectAllUserNetworkTask extends AsyncTask {
Context myContext;
List<user> productarray =new ArrayList<>();
private OkHttpClient client=new OkHttpClient();
public String Result;
public SelectAllUserNetworkTask(Context context)
{
this.myContext=context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Object doInBackground(Object[] params) {
try {
RequestBody requestBody;
requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("action","select")
.build();
Request request = new Request.Builder()
.url(Tags.UserAddress)
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
Result=response.body().string().toString();
String str=Result.substring(Result.indexOf("{"), Result.lastIndexOf("}"));
JSONObject jsonObject=new JSONObject(str);
JSONArray jsonArray = jsonObject.getJSONArray("result");
for (int i=0;i<jsonArray.length();i++) {
JSONObject jobject = jsonArray.getJSONObject(i);
user myUser =new user();
myUser.setUsId(jobject.getInt("id"));
myUser.setName(jobject.getString("name"));
myUser.setLastName(jobject.getString("lastname"));
myUser.setEmail(jobject.getString("email"));
myUser.setPassword(jobject.getString("password"));
myUser.setImage(jobject.getString("image"));
myUser.setGender(jobject.getString("gender"));
myUser.setBirthDay(jobject.getString("birthday"));
myUser.setFavFilm(jobject.getString("favFilm"));
myUser.setFavColor(jobject.getString("favColor"));
myUser.setAboutMe(jobject.getString("aboutme"));
myUser.setAdmin(jobject.getInt("admin"));
productarray.add(myUser);
}
/* Type typeList=new TypeToken<List<ModelProduct>>(){}.getType();
productarray=new Gson().fromJson(jsonObject.getString("result"),typeList);*/
listOfUser = productarray;
return productarray;
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
progressBar.setVisibility(View.GONE);
recyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(myContext);
llm.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(llm);
UserAdapter ca=new UserAdapter(listOfUser,myContext);
recyclerView.setAdapter(ca);
}
}
}
您应该更改这一行
echo(json_encode(array($arr)));
至
echo(json_encode(array('result'=>$arr)));
因为您在解析过程中访问结果,而php 中不存在该结果
首先,您的JSONResponse是JSONArray而不是JSONObject的形式。因此,将响应强制转换为JSONArray将导致解析错误。
其次,我在您得到的JSON响应中没有看到任何"结果"。
您可以使用以下代码:
$result = mysqli_query($connection,"SELECT * FROM Students");
$output = array();
while($row = mysqli_fetch_array($result)){
$record = array();
$record['id'] = $row['Id'];
$record['name'] = $row['Name'];
$record['phone'] = $row['Phone'];
$output[] = $record;
}echo json_encode($output);
和在安卓方面:
String res ;
JSONObject jsonObject=new JSONObject(res);
JSONArray jsonArray = jsonObject.getJSONArray("result");
for (int i=0;i<jsonArray.length();i++) {
JSONObject jobject = jsonArray.getJSONObject(i);
user myUser =new user();
myUser.setUsId(jobject.getInt("id"));
myUser.setName(jobject.getString("name"));
myUser.setAdmin(jobject.getInt("phone"));
productarray.add(myUser);
}
我希望这能为你工作;