上一篇文章讲的是最简单的通过接送的格式完成android客户端与php服务器交互,也就是通过JSONObject对象来进行交互。
从上篇的文章代码就可以看出来,如果php数组仅仅采用键值对的方式进行存储,通过很简单的方式转换为json格式,之后在android客户端进行
交互的时候通过JSONObject 也很快通过键值对的方式取到数据。
但是,有时候我们传递过来的参数并不是仅仅通过键值对的方式传递,可能比键值对的方式复杂一些(我们知道php数组的功能非常强大,支持很多种的数据存储方式,而直接通过一个json_encode() 函数就可以将php数组转化为json格式,也就是说存在不仅仅是键值对中一个key对应的都是一些简单的数据类型,可能也是数组等)。但是json同时也提供了JSONArray这一数据类型,通过一些简单的操作就可以将其转换成java中的ArrayList或者Map了。
android中包含四个与JSON有关的类和一个Exception,分别为
JSONObject:就如上篇文章提到的,包含一对儿(Key/Value)数值,注意这里的Value值保存一些基本的数据类型,
还有JSONArray,JSONOject或者默认值JSONOject.NULL object;
JSONArray:
它代表一组有序的数值,下面的代码可以非常直观的了解其用法;
JSONStringer:
根据官方解释,这个类可以帮助快速和便捷创建JSONtext.其最大的优点是可以减少由于格式的错误导致程序异常,引用这个类严格按照JSON
语法规则创建JSON text,每个JSONStringe实体只能可以对应创建一个JSON text。
JSONTokener:
这个是系统为JSONObject和JsonArray构造器解析JSON source string的类,它可以从source String中提取数值信息。
JSONException:
JSON.org抛出的异常信息
以上几个方面我们知道其实用处最多的就是JSONObject和JSONArray,下面的代码就可以很简单的了解JSONArray的基本用法了。
private boolean getJson()
{
boolean result = false;
HttpClient httpClient = new DefaultHttpClient();
//这里是你与服务器交互的地址
String validateUrl = "http://192.168.191.1/YCM/testjson.php";
//设置链接超时
httpClient.getParams().setParameter(CoreConnectionPNames.
CONNECTION_TIMEOUT, 5000);
//设置读取超时
httpClient.getParams().setParameter(
CoreConnectionPNames.SO_TIMEOUT, 5000);
HttpPost httpRequst = new HttpPost(validateUrl);
//准备传输的数据
List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
params.add(new BasicNameValuePair("user", "lewis"));
params.add(new BasicNameValuePair("password", "123"));
try
{
//发送请求
httpRequst.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
//得到响应
HttpResponse response = httpClient.execute(httpRequst);
//返回值如果为200的话则证明成功的得到了数据
if(response.getStatusLine().getStatusCode() == 200)
{
StringBuilder builder = new StringBuilder();
//将得到的数据进行解析
BufferedReader buffer = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
for(String s =buffer.readLine(); s!= null; s = buffer.readLine())
{
builder.append(s);
}
System.out.println(builder.toString());
/*
* 数据形式
* {"success":true,
"userList":
[{"id":0,"name":"Sam"},
{"id":1,"name":"lewis"},
{"id":2,"name":"Tom"},
{"id":3,"name":"Marry"},
{"id":4,"name":"Todd"}}}
*/
//这个地方的数据形式那么就不再是单独的键值对了,还有一些其他的复杂形式
JSONObject mObject = new JSONObject(builder.toString());
boolean success = mObject.getBoolean("success");
JSONArray mJSONArray= mObject.getJSONArray("userList");
ArrayList<HashMap<String, String>>mArray = new ArrayList<HashMap<String,String>>();
for(int i = 0 ; i < mJSONArray.length(); i++)
{
JSONObject jsonItem = mJSONArray.getJSONObject(i);
int id = jsonItem.getInt("id");
String name = jsonItem.getString("name");
HashMap map = new HashMap<String, String>();
map.put("id", id+"");
map.put("name", name);
mArray.add(map);
}
result = true;
}
} catch (Exception e)
{
e.printStackTrace();
}
return result;
}
这里只要清楚了JSON传输数据的格式基本上是个什么样子的,那 么该怎么获取其中的数据就很清楚了。
这里php代码也非常的简单,也采用模拟的形式
<?php
//这里应该是是从Mysql数据库中得到相应的数据,这里仅仅是模拟过程,不再写相应的数据库交互代码
$username = str_replace(" ", "", $_POST['user']);
$password = str_replace(" ", "", $_POST['password']);
$id = 1;
/*z这里尝试不同种的数组形式
*/
//这里等同的是一个二维数组
/*如果是一个二维数组的话一定要对其进行键值对标识清楚
*/
$arr = array();
$arr['success'] = true;
$arrListInfo = array();
for( $i = 0; $i< 5; $i++)
{
$arrTemp = array(
'id' => $i,
'name' => "lewis");
$arrListInfo[] = $arrTemp;
}
$arr['userList'] =$arrListInfo;
//var_dump($arr);
$strr = json_encode($arr);// 如果直接在浏览器中运行该代码就可以很清楚的看到JSON采用的格式方式了
echo($strr);
?>
这里例子不是很多,举得例子仅仅是一个有键值对和数组都存在的例子,如果仍然有疑问,可以参考一下点击打开链接,这篇文库中的例子非常多,举了好几种情况的例子,大家可以参考一下~
我想只要灵活运用了php数组,JsonObjecty以及JSONArray的话,那么从服务器获取一些简单的数据将不是问题。这里也充分的展现了php数组的魅力,
充分体现了php数组的灵活性。