PHP返回JSON数据既可以在网页端交互也可以与Android端交互,因此,PHP返回JSON数据相对比较重要。最近在做项目时就是用返回JSON数据来和Android端进行交互的。现总结如下:
1.PHP返回简单的json数据的代码实例:
$array = array('username'=>'博客', 'password'=>'123456',);
echo json_encode($array);
把要传递的数据放在一个关联数组中,然后通过json_encode()函数传递到Android端或网页端。
Android端接收json数据的核心代码:
StringBuilder builder = new StringBuilder();
HttpGet myget = new HttpGet("http://127.0.0.1/Android/index.php");
JSONObject jsonObject = new JSONObject(builder.toString());
String re_username = jsonObject.getString("username");
String re_password = jsonObject.getString("password");
2.从数据库中取多组数据并返回json数据的实例:
$getmsg = mysql_query("SELECT username,content FROM message ORDER BY id desc",$con);
$msg = array();
$i = 0;
while ($row = mysql_fetch_assoc($getmsg))
{
$msg[$i] = $row;
$i++;
}
print json_encode($msg);
但如果数据库中的结果中包含中文,那么json_encode()函数会把这些中文编码之后再返回,那么接收到的中文就是被编码后的中文,就会成为类似 \5HF这样的Unicode码,那么如何才能正确显示中文呢? 这就需要先对中文进行 urlencode编码,再用json_encode编码,在接收后再用urlencode编码,就保证了中文不显示的问题,具体可以包装在一个函数中:
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = 0;
if (++$recursive_counter > 1000)
{
die('possible deep recursion attack');
}
foreach ($array as $key => $value)
{
if (is_array($value))
{
arrayRecursive($array[$key], $function, $apply_to_keys_also);
}
else
{
$array[$key] = $function($value);
}
if ($apply_to_keys_also && is_string($key))
{
$new_key = $function($key);
if ($new_key != $key)
{
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
然后利用这个函数对数组进行操作:
function json1($array)
{
arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
return urldecode($json);
}
那么上面从数据库中取出的$msg就可以放在这个函数中传到Android端:
print json1($msg);
这样就解决了中文编码的问题。(注意中文在页面和数据库端的编码应该是utf-8)
本人经验,仅供参考!