天天看點

Android中對XML和JSON資料解析的方法彙總

就目前來講,在 Android 開發中,還是以 JSON 格式資料較為常見,但偶爾還是會碰到需要在項目中使用 XML 格式資料的情況,這篇文章總結了幾種常見的解析 XML 和 JSON 資料的用法

XML解析

<apps>
        <app>
            <id>111</id>
            <city>江西</city>
            <weather>陰轉晴</weather>
        </app>
        <app>
            <id>222</id>
            <city>湖南</city>
            <weather>雨夾雪</weather>
        </app>
    </apps>
           

Pull解析XML

private void parseXMLWithPull(String xmlData) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser pullParser = factory.newPullParser();
            pullParser.setInput(new StringReader(result));
            int eventType = pullParser.getEventType();
            final StringBuilder sb = new StringBuilder();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String nodeName = pullParser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG: {
                        if ("id".equals(nodeName)) {
                            sb.append(pullParser.nextText());
                        } else if ("city".equals(nodeName)) {
                           sb.append(pullParser.nextText());
                        } else if ("weather".equals(nodeName)) {
                            sb.append(pullParser.nextText());
                            sb.append("\n");
                        }
                        break;
                    }
                    case XmlPullParser.END_TAG:{
                        if ("app".equals(nodeName)) {
                            runOnUiThread(new Runnable() {
                                    mTextView.setText(sb.toString());//在主線程中更新UI
                                }
                            });
                        }
                        break;
                    }
                    default:
                        break;
                }
                eventType = pullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
           

SAX解析XML

private void parseXMLWithSAX(String xmlData) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            XMLReader xmlReader = factory.newSAXParser().getXMLReader();
            //通過擷取到的InputStream來得到InputSource執行個體
            InputSource inputSource = new InputSource(new StringReader(xmlData));
            //初始化自定義的類MyXMLParserHandler,将mList傳遞給它,以便裝載資料
            xmlReader.setContentHandler(new MyXMLParserHandler(mList));//之前要定義并初始化
            xmlReader.parse(inputSource);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
           

自定義MyXMLParserHandler類(BeanItem對象用來裝載值)

public class MyXMLParserHandler extends DefaultHandler {
        //聲明一個字元串變量
        private String content;
        //聲明一個裝載Beauty類型的List
        private List<BeanItem> mList;
        private BeanItem beanItem;

        public MyXMLParserHandler(List<BeanItem> mList) {
            this.mList = mList;
        }

        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
        }
        //開始解析某個節點
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if ("app".equals(localName)) {
                beanItem = new BeanItem();
            }
        }
        //當SAX解析器解析到某個屬性值時,會調用的方法,其中參數ch記錄了這個屬性值的内容
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            content = new String(ch,start,length);
        }

        //當SAX解析器解析到某個元素結束時,會調用的方法,其中localName記錄的是元素屬性名
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if ("id".equals(localName)) {
                beanItem.setId(content);
            } else if ("city".equals(localName)) {
                beanItem.setCity(content);
            } else if ("weather".equals(localName)) {
                beanItem.setWeather(content);
            } else if ("app".equals(localName)) {
                mList.add(beanItem);
            }
        }
        //完成整個XML解析時調用
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
        }
    }
           

DOM解析XML(Android不推薦)

解析JSON資料

[  
    {"id":"5","version":"5.5","name":"Angry Birds"},
    {"id":"6","version":"7.0","name":"Clash of Clans"},
    {"id":"7","version":"3.5","name":"Hey Day"}
]
           
  • JSONObject解析
private void parseJSONWithJSONObject(String jsonData) {
    try {
            JSONArray jsonArray = new JSONArray(jsonData);
            for (int i = ; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String id = jsonObject.getString("id");
                String name = jsonObject.getString("name");
                String version = jsonObject.getString("version");
            }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
           
  • GSON解析
private void parseJSONWithGSON(String jsonData) {
    Gson gson = new Gson();
    List<ItemBean> itemList = gson.fromJson(jsonData, newTypeToken<List<ItemBean>>() {}.getType());//ItemBean是吧JSON資料的id,version,name封裝成了一個對象
    for (ItemBean item : itemList) {
        Log.d("MainActivity", "id is " + item.getId());
        Log.d("MainActivity", "name is " + item.getName());
        Log.d("MainActivity", "version is " + item.getVersion());
    }
}
           

width="330" height="86" src="//music.163.com/outchain/player?type=2&id=5307982&auto=1&height=66">

繼續閱讀