Android 开发实践 解析XML和JSON格式的数据

标签: androidxmljson网络解析
3110人阅读 评论(0) 收藏 举报
分类:

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/51563677

上一篇介绍了 Android 网络通信中的 HttpUrlConnection 和 OkHttp 的使用方法,相信大家都能很轻松的实现网络上的GET请求和POST请求了,本篇将进一步扩展网络通信中传输的数据格式的相关内容。目前在网络上传输数据最常用的就是 XML 和 JSON。

1.解析XML格式的数据

这里提供一段XML格式的数据用于解析:

<items>
    <item>
        <id>1</id>
        <name>zhangsan</name>
        <age>20</age>
    </item>
    <item>
        <id>2</id>
        <name>lisi</name>
        <age>25</age>
    </item>
</items>

解析XML格式的数据有很多方式,这里重点介绍 Pull解析 和 SAX解析:

1.Pull解析方式

/**
 * @param xmlData XML格式数据
 */
private void parseXMLWithPull (String xmlData) {
    try {
        String id = "";
        String name = "";
        String age = "";
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser xmlPullParser = factory.newPullParser();
        xmlPullParser.setInput(new StringReader(xmlData));
        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();
                    } else if ("name".equals(nodeName)) {
                        name = xmlPullParser.nextText();
                    } else if ("age".equals(nodeName)) {
                        age = xmlPullParser.nextText();
                    }
                    break;
                // 完成解析某个节点
                case XmlPullParser.END_TAG:
                    if ("item".equals(nodeName)) {
                        Log.i("JAVA", "id:"+id+",name:"+name+",age:"+age);
                    }
                    break;
                default:
                    break;
            }
            eventType = xmlPullParser.next();
        }
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.SAX解析方式

/**
 * @param xmlData XML格式数据
 */
private void parseXMLWithSAX (String xmlData) {
    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader xmlReader = factory.newSAXParser().getXMLReader();
        ContentHandler handler = new ContentHandler();
        xmlReader.setContentHandler(handler); // 将ContentHandler的实例设置到XMLReader中
        xmlReader.parse(new InputSource(new StringReader(xmlData))); // 开始执行解析
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class ContentHandler extends DefaultHandler {
    private String nodeName;
    private StringBuilder id, name, age;
    // XML解析的时候调用
    @Override
    public void startDocument() throws SAXException {
        id = new StringBuilder();
        name = new StringBuilder();
        age = 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);
        } else if ("name".equals(nodeName)) {
            name.append(ch, start, length);
        } else if ("age".equals(nodeName)) {
            age.append(ch, start, length);
        }
    }
    // 完成解析某个节点的时候调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("item".equals(localName)) {
            Log.i("JAVA", "id:"+id.toString().trim()+",name:"+name.toString().trim()
                    +",age:"+age.toString().trim());
            id.setLength(0); // 最后将StringBuilder清空
            name.setLength(0);
            age.setLength(0);
        }
    }
    // 完成整个XML解析的时候调用
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}

2.解析JSON格式的数据

比起XML,JSON的主要优势在于它的体积更小,在网络上传输时可以更省流量。

这里提供一段JSON格式的数据用于解析:

[{"id":"1","name":"zhangsan","age":"20"},
{"id":"2","name":"lisi","age":"25"},
{"id":"3","name":"wangwu","age":"22"}]

解析JSON数据也有很多种方法,可以使用原生的JSONObject,也可以使用Google的开源库GSON,另外还有一些第三方开源库,比如Jackson、FastJSON等也非常不错。

1.JSONObject解析方式

/**
 * @param jsonData JSON格式数据
 */
private void parseJSONWithJSONObject (String jsonData) {
    try {
        JSONArray jsonArray = new JSONArray(jsonData);
        for (int i=0; i<jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            Log.i("JAVA", "id:"+jsonObject.getString("id")+",name:"+jsonObject.getString("name")
                    +",age:"+jsonObject.getString("age"));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

2.使用GSON解析

使用GSON解析需要添加Gradle依赖(https://github.com/google/gson):

compile 'com.google.code.gson:gson:2.8.0'

这里我们先新建实体类(Jackson、FastJSON也会用到这个实体类):

public class ItemBean {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

下面看一下如何使用GSON进行解析:

/**
 * @param jsonData JSON格式数据
 */
private void parseJSONWithGSON (String jsonData) {
    Gson gson = new Gson();
    List<ItemBean> itemList = gson.fromJson(jsonData, new TypeToken<List<ItemBean>>(){}.getType());
    for (ItemBean itemBean : itemList) {
        Log.i("JAVA", "id:"+itemBean.getId()+",name:"+itemBean.getName()+",age:"+itemBean.getAge());
    }
}

3.使用Jackson解析

Jackson在线文档 Jackson官网的翻译 Jackson源码查看

使用Jackson解析需要添加Gradle依赖(https://github.com/FasterXML/jackson):

compile 'com.fasterxml.jackson.core:jackson-databind:2.9.0.pr2'

下面看一下如何使用Jackson进行解析:

/**
 * @param jsonData JSON格式数据
 */
private void parseJSONWithFastJackson (String jsonData) {
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        List<ItemBean> itemList = objectMapper.readValue(jsonData, 
                new TypeReference<List<ItemBean>>(){});
        Log.i("JAVA", itemList.toString());
        for (ItemBean itemBean : itemList) {
            Log.i("JAVA", "id:"+itemBean.getId()+",name:"+itemBean.getName()+",age:"+itemBean.getAge());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

4.使用FastJSON解析

使用FastJSON解析也需要添加Gradle依赖(https://github.com/alibaba/fastjson):

compile 'com.alibaba:fastjson:1.2.28'

下面看一下如何使用FastJSON进行解析:

/**
 * @param jsonData JSON格式数据
 */
private void parseJSONWithFastJSON (String jsonData) {
    List<ItemBean> itemList = JSON.parseArray(jsonData, ItemBean.class);
    for (ItemBean itemBean : itemList) {
        Log.i("JAVA", "id:"+itemBean.getId()+",name:"+itemBean.getName()+",age:"+itemBean.getAge());
    }
}
15
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:363354次
    • 积分:3067
    • 等级:
    • 排名:第11328名
    • 原创:49篇
    • 转载:0篇
    • 译文:0篇
    • 评论:110条
    博客专栏
    最新评论