Android核心基础-7.Android 网络通信-4.获取网络XML,JSON

本讲继续讲解网络通信,通常我们在网络通信中都要使用到数据,且要结构化的数据。在结构化数据中,跨平台性、各语言对其解析比较好的主要有XML,JSON。

这讲,我们来讲讲XML

四、网络通信之获取结构化数据

4.1 获取XML

  • 使用AsyncHttpClient和TextHttpResponseHandler获取文本数据
  • 使用XmlPullParser和StringReader解析XML生成JavaBean

获取网络数据

public void getXml(View v) {

    new AsyncHttpClient().get("http://192.168.1.251:8080/WebServer/persons.xml", new TextHttpResponseHandler() {

        @Override
        public void onSuccess(int statusCode, Header[] headers, String responseString) {
            List<Person> persons = parseXml(responseString);
            for (Person p : persons)
                System.out.println(p);
            Toast.makeText(getApplicationContext(), "获取XML成功", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
            // TODO Auto-generated method stub
        }
    });
}

解析XML数据

private List<Person> parseXml(String xml) {
    List<Person> persons = new ArrayList<Person>();
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(new StringReader(xml));
        Person p = null;
        for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next()) {
            if (type == XmlPullParser.START_TAG) {
                if ("person".equals(parser.getName())) { // 如果开始的是person, 创建对象, 获取id数据
                    String id = parser.getAttributeValue(0);
                    p = new Person();
                    p.setId(Integer.parseInt(id));
                    persons.add(p);
                } else if ("name".equals(parser.getName())) { // 如果开始的是name, 获取下一个文本
                    String name = parser.nextText();
                    p.setName(name);
                } else if ("age".equals(parser.getName())) { // 如果开始的是age, 获取下一个文本
                    String age = parser.nextText();
                    p.setAge(Integer.parseInt(age));
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return persons;
}

4.2获取JSON

  • 使用AsyncHttpClient和JsonHttpResponseHandler获取JSONArray
  • 使用JSONArray和JSONObject解析JSON生成JavaBean

获取网络数据

public void getJson(View v) {
    new AsyncHttpClient().get("http://192.168.1.251:8080/WebServer/persons.js", new JsonHttpResponseHandler() {
        public void onSuccess(int statusCode, Header[] headers, JSONArray arr) {
            try {
                for (int i = 0; i < arr.length(); i++) { // 遍历JSONArray
                    JSONObject obj = arr.getJSONObject(i); // 得到每一个JSONObject
                    int id = obj.getInt("id"); // 获取每个JSONObject中的数据, 封装成Person
                    String name = obj.getString("name");
                    int age = obj.getInt("age");
                    Person p = new Person(id, name, age);
                    System.out.println(p);
                }
                Toast.makeText(getApplicationContext(), "获取JSON成功!!!", Toast.LENGTH_SHORT).show();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });

    /*
    new AsyncHttpClient().get("http://192.168.1.251:8080/WebServer/persons.js", new TextHttpResponseHandler() {

        @Override
        public void onSuccess(int statusCode, Header[] headers, String responseString) {
            List<Person> persons = parseJson(responseString);
            for (Person p : persons)
                System.out.println(p);
            Toast.makeText(getApplicationContext(), "获取JSON成功", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
        }
    });
    */
}

解析JSON数据

@SuppressWarnings("unused")
private List<Person> parseJson(String json) {
    List<Person> persons = new ArrayList<Person>();
    try {
        JSONArray arr = new JSONArray(json); // 把字符串封装成一个JSONArray
        for (int i = 0; i < arr.length(); i++) { // 遍历JSONArray
            JSONObject obj = arr.getJSONObject(i); // 得到每一个JSONObject
            int id = obj.getInt("id"); // 获取每个JSONObject中的数据, 封装成Person
            String name = obj.getString("name");
            int age = obj.getInt("age");
            Person p = new Person(id, name, age);
            persons.add(p);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return persons;
}

示例源码->百度网盘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值