导航
XML的三种解析方式
json全面解析和使用
Gson官方推荐的json解析方式
本节引言:
相信大家肯定对 Json 不陌生吧,我们和服务器交互一般用得较多的数据传递方式都是 Json 字符串的形式, 保存对象,我们也可以写成一个 Json 字符串然后存储!解析 Json 不知道你用的是 Gson,Fastjson,jackson 等,不过本节我们并不会去用这些第三方的解析库,而是使用 Android 自带的 Json 解析器来解析 Json! 好的,开始本节内容!
1.Json概念以及与XML的比较
1)Json是什么?
答:JavaScript Object Natation, 一种轻量级的数据交换格式, 与XML一样, 广泛被采用的客户端和服务端交互的解决方案!具有良好的可读和便于快速编写的特性。
2)Json与XML的比较:
- JSON和XML的数据可读性基本相同;
- JSON和XML同样拥有丰富的解析手段
- JSON相对于XML来讲,数据的体积小
- JSON与JavaScript的交互更加方便
- JSON对数据的描述性比XML较差
- JSON的速度要远远快于XML
PS:上述来自于百度~简单点说Json的优点:体积小,节省流量,只是不如XML直观,可读性 稍微差一点而已!
3)Json的格式规范:
就像协议一样,肯定是有一套规范的,毕竟双方都是通过Json字符串来传递数据,语法规则如下: 数据在名称/值对中;数据由逗号分隔;花括号保存对象;方括号保存数组; 而Json数据的书写格式:名称/值对 比如: "person":"coder-pig" 比如一个简单的Json字符串:
{
"sites": {
"site": [
{
"id": "1",
"name": "张三",
"age": "22"
},
{
"id": "2",
"name": "李四",
"age": "23"
},
{
"id": "3",
"name": "王五",
"age": "24"
}
]
}
}
2.Android给我们提供的Json解析类
这些API都存在于org.json包下,而我们用到的类有下面这些:
- JSONObject: Json对象,可以完成Json字符串与Java对象的相互转换
主要解析"{}"
- JSONArray: Json数组,可以完成Json字符串与Java集合或对象的相互转换
主要解析“[]”
- JSONStringer: Json文本构建类,这个类可以帮助快速和便捷的创建JSON text, 每个JSONStringer实体只能对应创建一个JSON text
- JSONTokener:Json解析类
- JSONException:Json异常
3.代码示例:本地解析Json字符串:
PS:这里我们就不另外写servlet或者请求网站,直接把Json写到字符串中来解析,模拟下就算了!
1)简单的Json字符串解析示例:
一层的Json字符串
[
{ "id":"1","name":"张三","age":"18" },
{ "id":"2","name":"李四","age":"18" },
{ "id":"3","name":"王五","age":"18" }
]
写一个解析上述Json字符串的方法:
String json=“[ { "id":"1","name":"张三","age":"18" },{ "id":"2","name":"李四","age":"18" },{"id":"3","name":"王五","age":"18" }]”
persons = new ArrayList();
try{
// JSONArray解析"["
JSONArray jsonArray = new JSONArray(json);
for(int i = 0;i < jsonArray.length();i++){
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
}
}catch (Exception e){e.printStackTrace();}
}
两层的Json字符串
site{[
{ "id":"1","name":"张三","age":"18" },
{ "id":"2","name":"李四","age":"18" },
{ "id":"3","name":"王五","age":"18" }
]}
那么就要用JSONObject去解析site这一层
JSONObject jsono=new JSONObject(s_json);
JSONArray jsona=jsono.getJSONArray("site");
for....
如果在site再加一层sites{site{....}},那么就要
JSONObject jsono=new JSONObject(s_json);
JSONObject jsono1=jsono.getJSONObject("sites");
JSONArray jsona=jsono1.getJSONArray("site");
4.网络解析Json
其实也超简单,就是从服务器上获取json呗,直接贴一下全部代码,下面用到了上一篇讲到的okgo的第三方库,以及一个person的封装类
Person
public class Person {
private int id;
private String name;
private int age;
public void setId(int id){
this.id = id;
}
public int getId(){
return this.id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
@Override
public String toString() {
return this.name + "~年方:" + this.age;
}
}
代码
OkGo.getInstance().init(getApplication());
OkGo.get("http://192.168.56.1:8080/11.json")
.execute(new StringCallback() {
@Override
public void onSuccess(Response response) {
s_json = response.body();
System.out.println(s_json);
try {
list = new ArrayList<>();
JSONObject jsono=new JSONObject(s_json);
JSONObject jsono1=jsono.getJSONObject("sites");
JSONArray jsona=jsono1.getJSONArray("site");
for (int i = 0; i < jsona.length(); i++) {
JSONObject jsonObject= (JSONObject) jsona.get(i);
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
Person p=new Person();
p.setId(id);
p.setName(name);
p.setAge(age);
list.add(p);
}
System.out.println(list);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
运行结果