Android--数据解析
一、XML解析:
1、Pull 解析方式:
1)先获取到一个 XmlPullParserFactory 的实例, 并借助这个实例得到 XmlPullParser 对象;
2)调用 XmlPullParser 的 setInput() 方法将服务器返回的XML 数据设置进去;
3)通过 getEventType() 方法可以得到当前的解析事件,可以使用循环来进行解析,如果当前的解析事件不等于 XmlPullParser.END_DOCUMENT,说明解析工作还没完成,调用 next() 方法后可以获取下一个解析事件。
示例代码:
private void parseXmlWithPull(String xml){ try{ XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); parser.setInput(new StringReader(xml)); //获取节点类型 int eventType = parser.getEventType(); while(eventType != XmlPullParser.END_DOCUMENT){ // 获取当前解析节点名 String nodeName = parser.getName(); switch(eventType){ // 开始解析某个结点 case XmlPullParser.START_TAG: break; // 完成解析某个结点 case XmlPullParser.END_TAG: break; default: break; } parser.next(); } }catch (Exception e){ e.printStackTrace(); } }
2、SAX解析方式:
1)新建一个类继承自 DefaultHandler;
2)重写如下 5 个方法:
--startDocument(): 在开始XML 解析的时候调用;
--startElement(): 在开始解析某个结点的时候调用;
--characters(): 在获取结点中内容的时候调用;
--endElement(): 在完成解析某个结点的时候调用;
--endDocument():完成整个XML 解析的时候调用。
public class ContentHandler extends DefaultHandler { @Override public void startDocument() throws SAXException { super.startDocument(); } /**方法里面参数为被解析节点的信息,如localName表示节点名*/ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); } @Override public void endDocument() throws SAXException { super.endDocument(); } }
3)创建 SAXParserFactory 实例 :SAXParserFactory factory = SAXParserFactory.newInstance();
4)创建 XMLReader 对象:XMLReader xmlReader = factory.newSAXParser().getXMLReader();
5)新建自定义的 ContentHandler 对象;
6)将ContentHandler的实例设置到 XMLReader 中;
7)调用 XMLReader 的 parse() 方法开始解析:xmlReader.parse(new InputSource(new StringReader(xmlData)));
代码示例:
private void parseXmlWithSAX(String xml){ try{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXMLReader(); ContentHandler handler = new ContentHandler(); reader.setContentHandler(handler); reader.parse( new InputSource( new StringReader(xml) ) ); }catch (Exception e){ e.printStackTrace(); } }
二、Json解析:
1、使用 JSONObject 解析:
private void parseJsonWithJSONObject(String json){ try{ JSONArray jsonArray = new JSONArray(json); for(int i = 0; i < jsonArray.length(); i++){ JSONObject jsonObject = jsonArray.getJSONObject(i); String data = jsonObject.getString("data"); ......; } }catch (Exception e){ e.printStackTrace(); } }
2、使用 GSON 解析:GSON 解析 Json更为简单
1)使用 GSON 前需要导入 jar 包:gson-2.2.4.jar
2)GSON 可以将一段JSON 格式的字符串自动映射成一个对象,从而不需要手动解析;
private void parseJSONWithGSON(String jsonData) { Gson gson = new Gson(); List<Object> data = gson.fromJson(jsonData, new TypeToken<List<Object>>() {}.getType()); for (Object obj : data) { ......; } }
3)若解析的不是一个 JSON 数组,则可以直接写成:ObjectType type = gson.fromJson(jsonData, ObjectType.class);