Android 之json全面解析和使用

导航

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();
                        }
                    }

                });

运行结果

你可能感兴趣的:(Android 之json全面解析和使用)