下面我们就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的方法类
b.JsonObjectRequest是传输{}包裹起来的一个对象(Object),{"username":"1011","password":"123"}
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