Android学习笔记 —— 十二 、 解析服务器返回的XML或JSON类型数据

一、XML数据的解析

1. 使用Pull解析方式
  1. 设定request目标获取要解析的XML文件,比如本地服务器的get_data.xml:
Request request = new Request.Builder()
						.url("http://10.0.2.2/get_data.xml")
						.build();

一般情况下:
电脑本地服务器地址为 http://localhost 或者 http://127.0.0.1
在模拟器里想要访问电脑设置的本地服务器需要访问 http://10.0.2.2

  1. 获取XmlPullParser对象并通过setInput方法设置解析数据开始解析
    //获取一个XmlPullParserFactory实例
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    //通过XmlPullParserFactory实例获取一个XmlPullParser对象
    XmlPullParser xmlPullParser = factory.newPullParser();
    //通过setInput方法开始解析
    xmlPullParser.setInput(new StringReader(xmlData));

  1. 解析过程示例
					//通过getEventType方法获取到当前的解析事件
                    int eventType = xmlPullParser.getEventType();
                    //判断当前的解析事件是不是结束标志
                    while (eventType != XmlPullParser.END_DOCUMENT) {

                        //获取当前节点名
                        String nodeName = xmlPullParser.getName();
                        //针对当前的解析事件执行不同的操作
                        switch (eventType) {
                            case XmlPullParser.START_TAG:
                                //通过比对节点名获取对应的数据
                                if ("id".equals(nodeName)) {
                                    id = xmlPullParser.nextText();
                                }
                                break;
                            case XmlPullParser.END_TAG:
                                if ("app".equals(nodeName)) {
                                    Log.d(TAG, "id is: " + id);
                                }
                                break;
                            default:
                                break;
                        }
                        //获取下一个解析事件
                        eventType = xmlPullParser.next();
                    }
2. 使用SAX解析方式

SAX解析方式与Pull方式不同,它将具体的步骤分为不同的方法封装成一个类DefaultHandler。我们需要通过自己新建一个子类来继承它并重写它的五个方法,针对不同的方法在其中书写对应的逻辑处理即可。

方法 作用
startDocument 开始解析时调用
startElement 开始解析某个节点调用
characters 获取节点内容时调用
endElement 完成解析某个节点
endDocument 完成解析时调用

比如这样:

    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        nodeName = localName;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if ("id".equals(nodeName)) {
            id.append(ch, start, length);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("app".equals(localName)) {
            //通过trim方法删除字符串开头和结尾可能存在的空格(包括连续空格)和制表符
            Log.d("MyContentHandler", "id is: " + id.toString().trim());
            //清空数据用来进行下一次读取
            id.setLength(0);
        }
    }

    @Override
    public void endDocument() throws SAXException {
        
    }

解析过程:
其过程整体和Pull没有太大区别,区别是在自定义DefaultHandler类后我们不需要在这里书写解析过程了。毕竟已经在自定义DefaultHandler类中书写过了

    //获取一个SAXParserFactory对象,通过它获取XMLReader对象
    SAXParserFactory factory = SAXParserFactory.newInstance();
    XMLReader xmlReader = factory.newSAXParser().getXMLReader();
    //实例化一个自定义DefaultHandler对象
    MyContentHandler handler = new MyContentHandler();
    //配置xmlReader开始解析数据
    xmlReader.setContentHandler(handler);
    xmlReader.parse(new InputSource(new StringReader(responseData)));

二、JSON数据的解析

1. 使用JSONObject解析方式

和XML解析相比,JSON的解析看起来简单很多:

//解析数据
JSONArray jsonArray = new JSONArray(responseData);
//取出数据
for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject jsonObject = jsonArray.getJSONObject(i);
    String id = jsonObject.getString("id");
    Log.d(TAG, "json id is " + id);
}
2. 使用GSON解析方式

GSON是谷歌提供的一个开源库。
项目主页:GSON
导入GSON:

	implementation 'com.google.code.gson:gson:2.8.5'

GSON解析方式需要我们将要解析的集合定义成一个类:

public class GsonApp {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

解析:

//获取一个Gson对象
Gson gson = new Gson();

//使用List<>存储通过fromJson方法解析的数据
//第一个参数是要解析的数据,第二个参数是自定义的解析数据集合数据类型
//这里由于是一个List<>列表,所以通过TypeToken<>(){}.getType方法来获取数据类型
List<GsonApp> appList = gson.fromJson(responseData, new TypeToken<List<GsonApp>>() {}.getType());
//显示数据
for (GsonApp app : appList) {
	Log.d(TAG, "json id is " + app.getId());
}

fromJson方法的标准使用方法为:

Data data = gson.fromJson(jsonData, Data.class);

你可能感兴趣的:(Android学习笔记)