目前在网络的数据传输过程中,大家比较常用的包括xml和json数据格式,这两种数据格式都有比较成熟的标准进行约束,同时也有一些api实现来进行处理,那么今天就几个常用的方式对xml和json的解析进行一个简单的比较:
1、测试对象
数据对象:
com.test.entity.OrderMsg
使用的api:
xstream方式 com.thoughtworks.xstream.XStream;
dom方式 org.dom4j.Document
json方式 com.google.gson.Gson
2、文档格式
2.1 xml格式文档(用于xstream 和 dom的测试)
<?xml version="1.0" encoding = "utf-8"?>
<orderMsg>
<recordCount>20</recordCount>
<userId>1</userId>
<startTime>20110324</startTime>
<endTime>20110326</endTime>
<startNo>0</startNo>
<recordSize>20</recordSize>
<orderRecds>
<orderRecd>
<awardNum>01,02,03,04,05,06|15</awardNum>
</orderRecd>
<orderRecd>
<awardNum>01,02,03,04,05,06|14</awardNum>
</orderRecd>
<orderRecd>
<awardNum>01,02,03,04,05,06|13</awardNum>
</orderRecd>
<orderRecd>
<awardNum>01,02,03,04,05,06|12</awardNum>
</orderRecd>
</orderRecds>
</orderMsg>
2.2 json格式文档
{"recordCount":"20","userId":"1","startTime":"20110324","endTime":"20110326","startNo":"0","recordSize":"20","orderRecds":[{"awardNum":"01,02,03,04,05,06|15"},{"awardNum":"01,02,03,04,05,06|14"},{"awardNum":"01,02,03,04,05,06|13"},{"awardNum":"01,02,03,04,05,06|12"}]}
3、测试结果
表-1
方式 |
生成/解析 |
执行次数 |
时间(毫秒) |
DOM |
生成xml |
1万 |
594 |
xstream |
生成xml |
1万 |
7969 |
json方式 |
生成json |
1万 |
3547 |
DOM |
生成xml |
10万 |
4438 |
xstream |
生成xml |
10万 |
78390 |
json方式 |
生成json |
10万 |
31813 |
DOM |
解析xml成对象 |
1万 |
9890 |
xstream |
解析xml成对象 |
1万 |
9484 |
json方式 |
解析json成对象 |
1万 |
250 |
DOM |
解析xml成对象 |
10万 |
92844 |
xstream |
解析xml成对象 |
10万 |
89110 |
json方式 |
解析json成对象 |
10万 |
2437 |
从表-1中可以看到,在生成xml处理中,使用DOM方式要明显优于使用xstream方式,而在解析过程中,则相差无几;而json和xml比较,生成json格式的效率比较中,com.google.gson.Gson要优于xstream,逊色于DOM方式,而在解析生成对象的处理中,则明显优于两个xml解析成对象的效率。
下面是测试代码:
4、附--测试程序代码,供参考;
public class Test {
private static XStream xstream = new XStream(new DomDriver());
/**
* <p> 方法 main</p>
*
* @param args
* @throws DocumentException
* @throws IOException
*/
public static void main(String[] args) throws DocumentException, IOException {
// 测试转化效率
OrderMsg msg = new OrderMsg();
msg.setUserId("1");
msg.setStartTime("20110324");
msg.setEndTime("20110326");
msg.setStartNo("0");
msg.setRecordCount("20");
msg.setRecordSize("20");
List<OrderRecd> orderRecds = new ArrayList<OrderRecd>();
OrderRecd orderRecd = new OrderRecd();
orderRecd.setAwardNum("01,02,03,04,05,06|15");
orderRecds.add(orderRecd);
orderRecd = new OrderRecd();
orderRecd.setAwardNum("01,02,03,04,05,06|14");
orderRecds.add(orderRecd);
orderRecd = new OrderRecd();
orderRecd.setAwardNum("01,02,03,04,05,06|13");
orderRecds.add(orderRecd);
orderRecd = new OrderRecd();
orderRecd.setAwardNum("01,02,03,04,05,06|12");
orderRecds.add(orderRecd);
msg.setOrderRecds(orderRecds);
// 测试
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><orderMsg><recordCount>20</recordCount><userId>1</userId><startTime>20110324</startTime><endTime>20110326</endTime><startNo>0</startNo><recordSize>20</recordSize><orderRecds><orderRecd><awardNum>01,02,03,04,05,06|15</awardNum></orderRecd><orderRecd><awardNum>01,02,03,04,05,06|14</awardNum></orderRecd><orderRecd><awardNum>01,02,03,04,05,06|13</awardNum></orderRecd><orderRecd><awardNum>01,02,03,04,05,06|12</awardNum></orderRecd></orderRecds></orderMsg>";
String str ="{\"recordCount\":\"20\",\"userId\":\"1\",\"startTime\":\"20110324\",\"endTime\":\"20110326\",\"startNo\":\"0\",\"recordSize\":\"20\",\"orderRecds\":[{\"awardNum\":\"01,02,03,04,05,06|15\"},{\"awardNum\":\"01,02,03,04,05,06|14\"},{\"awardNum\":\"01,02,03,04,05,06|13\"},{\"awardNum\":\"01,02,03,04,05,06|12\"}]}";
long st = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
// xstream 方式*****
// objToString(msg); // 生成
stringToObj(xml); // 解析
// dom方式**********
// objToStringDom(msg); // 生成
// strubgToObjDom(xml); // 解析
// google json方式
// objToStringJson(msg); // 生成
// stringToObjJson(str); // 解析
}
long en = System.currentTimeMillis();
System.out.println(en - st);
}
// xstream 方式 ******
static String objToString(OrderMsg obj) {
xstream.processAnnotations(new Class[] { OrderMsg.class, OrderRecd.class});
return xstream.toXML(obj);
}
static void stringToObj(String xml) {
xstream.alias("orderMsg", OrderMsg.class);
xstream.alias("orderRecd", OrderRecd.class);
xstream.fromXML(xml);
}
// dom 方式********
static void objToStringDom(OrderMsg obj) {
Document doc = new DefaultDocument();
doc.setXMLEncoding("utf-8");
// 根
Element orderRecdEle = doc.addElement("orderMsg");
orderRecdEle.addElement("recordCount").addText(obj.getRecordCount());
orderRecdEle.addElement("userId").addText(obj.getUserId());
orderRecdEle.addElement("startTime").addText(obj.getStartTime());
orderRecdEle.addElement("endTime").addText(obj.getEndTime());
orderRecdEle.addElement("startNo").addText(obj.getStartNo());
orderRecdEle.addElement("recordSize").addText(obj.getRecordSize());
Element orderRecdsEle = orderRecdEle.addElement("orderRecds");
List<OrderRecd> orderRecds = obj.getOrderRecds();
for (OrderRecd recd : orderRecds) {
Element temEle = orderRecdsEle.addElement("orderRecd");
temEle.addElement("awardNum").addText(recd.getAwardNum());
}
doc.asXML();
}
static void strubgToObjDom(String xml) throws DocumentException {
SAXReader reader = new SAXReader(false);
reader.setEncoding("UTF-8");
Document doc = reader.read(new InputSource(new StringReader(xml)));
Element orderMsgEle = doc.getRootElement();
OrderMsg orderMsg = new OrderMsg();
orderMsg.setEndTime(orderMsgEle.elementText("endTime"));
orderMsg.setRecordCount(orderMsgEle.elementText("recordCount"));
orderMsg.setRecordSize(orderMsgEle.elementText("recordSize"));
orderMsg.setStartNo(orderMsgEle.elementText("startNo"));
orderMsg.setStartTime(orderMsgEle.elementText("startTime"));
orderMsg.setUserId(orderMsgEle.elementText("userId"));
List<Element> lst = orderMsgEle.element("orderRecds").elements();
List<OrderRecd> orderRecds = new ArrayList<OrderRecd>();
for (Element element : lst) {
OrderRecd orderRecd = new OrderRecd();
orderRecd.setAwardNum(element.elementText("awardNum"));
orderRecds.add(orderRecd);
}
orderMsg.setOrderRecds(orderRecds);
}
// google json方式
static void objToStringJson(OrderMsg obj) {
Gson gson = new Gson();
gson.toJson(obj);
}
static void stringToObjJson(String str) throws IOException {
OrderMsg orderMsg = new OrderMsg();
JsonReader reader = new JsonReader(new StringReader(str));
reader.beginObject();
while (reader.hasNext()) {
String tagName = reader.nextName();
if ("recordCount".equals(tagName)) {
orderMsg.setRecordCount(reader.nextString());
} else if ("userId".equals(tagName)) {
orderMsg.setUserId(reader.nextString());
} else if ("startTime".equals(tagName)) {
orderMsg.setStartTime(reader.nextString());
} else if ("endTime".equals(tagName)) {
orderMsg.setEndTime(reader.nextString());
} else if ("startNo".equals(tagName)) {
orderMsg.setStartNo(reader.nextString());
} else if ("recordSize".equals(tagName)) {
orderMsg.setRecordSize(reader.nextString());
} else if ("orderRecds".equals(tagName)) {
List<OrderRecd> orderRecds = new ArrayList<OrderRecd>();
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
while (reader.hasNext()) {
if ("awardNum".equals(reader.nextName())) {
OrderRecd orderRecd = new OrderRecd();
orderRecd.setAwardNum(reader.nextString());
orderRecds.add(orderRecd);
}
}
reader.endObject();
}
reader.endArray();
orderMsg.setOrderRecds(orderRecds);
}
}
reader.endObject();
}
}