JSON java.lang.String 类型的异常值连接无法转换为 JSON 数组
JSON Exception value connection of type java.lang.String cannot be converted to JSONArray
PHP代码:(DBadapter.php)
<?php
require_once 'init.php';
class DBadapter
{
public function select()
{
global $con;
$retrived = $con->query("select id,name,quantity from product");
echo"in DBadapter";
if ($retrived) {
while ($row=mysqli_fetch_array($retrived)) {
$product[]=$row;
}
print(json_encode($product));
}
else
{
print(json_encode(array("CANT retrive data")));
}
}
}
?>
(index.php):
<?php
require_once 'DBadapter.php';
$dbadapter=new DBadapter();
$dbadapter->select();
?>
Android代码:(这里的catch块正在执行)
此处 table "products" 的数据是从 phpMysql 数据库中获取的,并在 android studio
的 Tableview 中检索
package edmt.dev.androidgridlayout.mMySQL;
import android.content.Context;
import android.widget.Toast;
import com.androidnetworking.AndroidNetworking;
import com.androidnetworking.common.Priority;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONArrayRequestListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import de.codecrafters.tableview.TableView;
import de.codecrafters.tableview.toolkit.SimpleTableDataAdapter;
import edmt.dev.androidgridlayout.TableHelper;
import edmt.dev.androidgridlayout.mModel.Product;
public class MySQLClient {
private static final String retrive_url="http://10.0.2.2/kamakshi/index.php";
private final Context c;
private SimpleTableDataAdapter adapter;
public MySQLClient(Context c) {
this.c = c;
}
public void retrive(final TableView tb)
{
final ArrayList<Product> products = new ArrayList<>();
AndroidNetworking.get(retrive_url)
.setPriority(Priority.HIGH)
.build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
JSONObject jo;
Product p;
try {
for (int i=0;i<response.length();i++)
{
jo=response.getJSONObject(i);
int id=jo.getInt("id");
String name=jo.getString("name");
String quantity=jo.getString("quantity");
p = new Product();
p.setId(id);
p.setName(name);
p.setQuantity(quantity);
products.add(p);
}
adapter = new SimpleTableDataAdapter(c,new TableHelper(c).returnProductArray(products));
tb.setDataAdapter(adapter);
}catch (JSONException e)
{
Toast.makeText(c,"JSON Error"+e.getMessage(),Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(ANError anError) {
anError.printStackTrace();
Toast.makeText(c,"unsuccessful : error is :"+anError.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
输出:android工作室模拟器
的输出
输出:它是 android 工作室
中 logcat 的输出
Its the output of index.php opened in webbrowser
我认为问题出在响应的内容类型上。默认情况下,来自 PHP 服务器的任何响应的内容类型都是 plain/text。因此,android 库将其视为 纯文本响应 而不是 JSON 响应.
要解决您的问题,您可能需要通过在 print 之前添加以下内容,将响应内容类型设置为 application/json声明。
header('Content-Type: application/json');
编辑:
正如我在输出和您的代码中看到的那样,您正在打印一些额外的字符串,输出为 Connection Successful 和 echo"in DBadapter"; (在 DBadaper.php 中)。因此,输出变得无效 JSON。只需删除那些 echo 语句,您的代码就可以工作了
PHP代码:(DBadapter.php)
<?php
require_once 'init.php';
class DBadapter
{
public function select()
{
global $con;
$retrived = $con->query("select id,name,quantity from product");
echo"in DBadapter";
if ($retrived) {
while ($row=mysqli_fetch_array($retrived)) {
$product[]=$row;
}
print(json_encode($product));
}
else
{
print(json_encode(array("CANT retrive data")));
}
}
}
?>
(index.php):
<?php
require_once 'DBadapter.php';
$dbadapter=new DBadapter();
$dbadapter->select();
?>
Android代码:(这里的catch块正在执行)
此处 table "products" 的数据是从 phpMysql 数据库中获取的,并在 android studio
的 Tableview 中检索package edmt.dev.androidgridlayout.mMySQL;
import android.content.Context;
import android.widget.Toast;
import com.androidnetworking.AndroidNetworking;
import com.androidnetworking.common.Priority;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONArrayRequestListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import de.codecrafters.tableview.TableView;
import de.codecrafters.tableview.toolkit.SimpleTableDataAdapter;
import edmt.dev.androidgridlayout.TableHelper;
import edmt.dev.androidgridlayout.mModel.Product;
public class MySQLClient {
private static final String retrive_url="http://10.0.2.2/kamakshi/index.php";
private final Context c;
private SimpleTableDataAdapter adapter;
public MySQLClient(Context c) {
this.c = c;
}
public void retrive(final TableView tb)
{
final ArrayList<Product> products = new ArrayList<>();
AndroidNetworking.get(retrive_url)
.setPriority(Priority.HIGH)
.build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
JSONObject jo;
Product p;
try {
for (int i=0;i<response.length();i++)
{
jo=response.getJSONObject(i);
int id=jo.getInt("id");
String name=jo.getString("name");
String quantity=jo.getString("quantity");
p = new Product();
p.setId(id);
p.setName(name);
p.setQuantity(quantity);
products.add(p);
}
adapter = new SimpleTableDataAdapter(c,new TableHelper(c).returnProductArray(products));
tb.setDataAdapter(adapter);
}catch (JSONException e)
{
Toast.makeText(c,"JSON Error"+e.getMessage(),Toast.LENGTH_LONG).show();
}
}
@Override
public void onError(ANError anError) {
anError.printStackTrace();
Toast.makeText(c,"unsuccessful : error is :"+anError.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
输出:android工作室模拟器
的输出输出:它是 android 工作室
中 logcat 的输出Its the output of index.php opened in webbrowser
我认为问题出在响应的内容类型上。默认情况下,来自 PHP 服务器的任何响应的内容类型都是 plain/text。因此,android 库将其视为 纯文本响应 而不是 JSON 响应.
要解决您的问题,您可能需要通过在 print 之前添加以下内容,将响应内容类型设置为 application/json声明。
header('Content-Type: application/json');
编辑: 正如我在输出和您的代码中看到的那样,您正在打印一些额外的字符串,输出为 Connection Successful 和 echo"in DBadapter"; (在 DBadaper.php 中)。因此,输出变得无效 JSON。只需删除那些 echo 语句,您的代码就可以工作了