下面我们就volley框架为例,讲讲json的使用与解析。
1.json是什么?为什么不使用xml?
json是一种轻量级的数据交换格式
格式:JSON 的书写格式是:名称/值对--例如:"username":"1011"
结构:在volley中有三种格式的数据可以传输,其中有一个就是String,其他两个就是json的两种书写格式
对象结构:使用{ };数组结构[];
完整事例一:
{"username":"1011","password":"123"}
二:{"information":{"username":"1011","password":"123"},"age":"21"}
三:{"person":[{"information1":{"username":"1011","password":"123"},"age1":"21"},{"information2":{"username":"1011","password":"123"},"age2":"21"}],"count":[{},{}]}
为什么不使用xml:
xml:安卓布局就是xml
例:
android:id="@+id/volley_image"
android:layout_width="100dp"
android:layout_height="100dp"
json:JSON更为清晰且冗余更少些。JSON语法的有严格描述,只是描述较简短。从总体来看,XML比较适合于标记 文档,而JSON却更适于进行数据交换处理。
使用JSON作为传输格式的优势:
1、格式简单,易于读写,格式经过压缩,带宽占用小,体积小,省流量;
2、易于解析,客户端JavaScript可以直接通过eval()进行JSON数据的读取;
3、扩展性好,在javascript中有着XML无法比拟的绝对优势;
4、支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等语言服务器端语言,并都有相应的解析工具或包,便于服务器端的解析;
5、简化了服务器端和客户端的代码开发量,因为JSON格式能够直接为服务器端或客户端代码使用,而不需要再进行解析,这样就提高了开发速度和易于维护。
6、在目前比较流行的Ajax框架中,都支持并推荐使用JSON格式,并且在Web Service中也在逐步推广。
缺点:
1、 推广力度不够强,使用还不够广泛,通用性不是很强;语义性差,看起来不如XML直观
2、 相关资料相对而言比较少;
3、 JSON格式目前在Web Service中推广还属于初级阶段。
2.volley的三个文本数据交换类获取(StringRequest、JsonObjectRequest、JsonArrayRequest)
JSONObject是一个{}包裹起来的一个对象(Object),
而JSONArray则是[]包裹起来的一个数组(Array),
a.StringRequest,只是由于获取一个String的方法类
[java] view plain copy print ?
1. private void getvolley() {
2. / 1.StringRequest
3. //创建StringRequest网络请求
4. new StringRequest(Method.GET, get_url,new Listener<String>() {
5. @Override
6. public void onResponse(String arg0) {
7. // TODO Auto-generated method stub
8. }
9. new ErrorListener() {
10. @Override
11. public void onErrorResponse(VolleyError arg0) {
12. // TODO Auto-generated method stub
13. }
14. });
15. "getvolley_str");//设置标签,方便退出Activity时结束这个网络请求
16. //添加到全局队列<span style="font-family: 宋体; white-space: pre-wrap;">}</span>
b.JsonObjectRequest是传输{}包裹起来的一个对象(Object),{"username":"1011","password":"123"}
[java] view plain copy print ?
1. private void getvolley() {
2. / 2.JsonObjectRequest
3. //创建JsonObjectRequest网络请求
4. new JsonObjectRequest(Method.GET, get_url,
5. null,new Listener<JSONObject>() {
6. @Override
7. public void onResponse(JSONObject arg0) {
8. // TODO Auto-generated method stub
9. }
10. new ErrorListener() {
11. @Override
12. public void onErrorResponse(VolleyError arg0) {
13. // TODO Auto-generated method stub
14. }
15. });
16. "getvolley_jsonobj");//设置标签,方便退出Activity时结束这个网络请求
17. //添加到全局队列
18. }
c.
JsonArrayRequest是[]包裹起来的一个数组(Array)[{},{}]
[java] view plain copy print ?
1. private void getvolley() {
2. // 3.JsonArrayRequest
3. //创建JsonArrayRequest网络请求
4. new JsonArrayRequest(get_url, new Listener<JSONArray>() {
5. @Override
6. public void onResponse(JSONArray arg0) {
7. // TODO Auto-generated method stub
8. }
9. new ErrorListener() {
10. @Override
11. public void onErrorResponse(VolleyError arg0) {
12. // TODO Auto-generated method stub
13. }
14. });
15. "getvolley_jsonarr");//设置标签,方便退出Activity时结束这个网络请求
16. //添加到全局队列
17. }
JSON有两种解析方式:JsonObject和Gson
private void parseJSONWithJsonObject(String json){
try {
JSONArray array=new JSONArray(json);
for (int i=0;i<array.length();i++){
JSONObject obj=array.getJSONObject(i);
String id=obj.getString("id");
String name=obj.getString("name");
}
} catch (Exception e) {
e.printStackTrace();
}
}
假设返回的是一个json数组,则得到服务器的返回数据后,首先将返回数据传入一个JsonArray,然后循环遍历整个array,从中取得的每一个元素都是一个JsonObject,在调用getString将数据取出。
private void parseJSONWithGson(String json){
Gson gson=new Gson();
List<Person> list=gson.fromJson(json,new TypeToken<List<Person>>(){}.getType());
for (Person person:list){
Log.d("Activity",person.getId());
Log.d("Activity",person.getName());
}
}
定义一个Person类,有id和name两个字段,并有setter和getter方法。
如果需要解析的是JSON数据直接Person person=gson.fromJson(json,Person.class);
如果需要解析的是数组,则要借助TypeToken将期望解析成的数据类型传入fromJson:List<Person> list=gson.fromJson(json,new TypeToken<List<Person>>(){}.getType());再foreach遍历list