我正在为Android创建一个Web服务,其中必须从MySQL数据库读取blob字段。问题是我无法将该字段编码为JSON,这是以后读取Android Web服务时需要的格式。
让我们看看是否有人知道我在做什么错。这是我的PHP Web服务:
<?php
require('../../conect/conect.php');
$dbh -> exec("set names utf8");
$res=$dbh->query("select cast(mensaje as char(10000) character set utf8) mensa from ges_mensajes where cod_destino=4;");
$datos = array();
foreach ($res as $row) {
$datos[] = $row;
}
//print_r($datos); //Si ejecuto esta línea me sale bien por pantalla
echo json_encode($datos);
?>
我尝试将其转换为char而不进行转换……事实是,如果我使用print_r打印,则会在屏幕上获取数据,但是当我将其编码为JSON时,却什么也没得到。
这就是我从Android阅读的方式:
public void ObtMensaje_volley(){
ArrayList<String> mensaje = new ArrayList<>();
String url = "https://local.es/WS_neton/obt_mensaje_blob.php";
StringRequest eventfulRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
String mensajeM;
for (int i=0; i<jsonArray.length(); i++){
mensajeM = jsonArray.getJSONObject(i).getString("mensa");
mensaje.add(mensajeM);
//Toast.makeText(getApplicationContext(), "mensaje: "+String.valueOf(mensajeM), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//Log.e("Error: ", error.toString());
}
});
VolleySingleton.getInstance(this)
.addToRequestQueue(eventfulRequest);
}
Android返回此错误:
W / System.err:org.json.JSONException:输入结尾(字符0为
)
但是我不知道问题是来自网络服务还是来自Android
欢迎任何帮助。 谢谢
答案 0 :(得分:0)
我对自己说,因为经过多次尝试,我找到了可接受的解决方案。错误出在SQL语句中,该语句必须预先转换为一组字符,在本例中为Latin1。看起来像这样:
$res=$dbh->query("select CONVERT(CAST(mensaje as BINARY) USING latin1) as mensa from ges_mensajes where cod_destino=4;");
json返回的内容可以识别html字符和标签。例如,只剩下使用WebView读取android上的webservice了,它将识别base64中的奇怪字符和图像。