转载请注明出处:http://blog.csdn.net/smartbetter/article/details/51563677
上一篇介绍了 Android 网络通信中的 HttpUrlConnection 和 OkHttp 的使用方法,相信大家都能很轻松的实现网络上的GET请求和POST请求了,本篇将进一步扩展网络通信中传输的数据格式的相关内容。目前在网络上传输数据最常用的就是 XML 和 JSON。
1.解析XML格式的数据
这里提供一段XML格式的数据用于解析:
<items>
<item>
<id>1id>
<name>zhangsanname>
<age>20age>
item>
<item>
<id>2id>
<name>lisiname>
<age>25age>
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);
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;
@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);
name.setLength(0);
age.setLength(0);
}
}
@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 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 itemList = gson.fromJson(jsonData, new TypeToken>(){}.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 itemList = objectMapper.readValue(jsonData,
new TypeReference>(){});
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 itemList = JSON.parseArray(jsonData, ItemBean.class);
for (ItemBean itemBean : itemList) {
Log.i("JAVA", "id:"+itemBean.getId()+",name:"+itemBean.getName()+",age:"+itemBean.getAge());
}
}