目前在网络的数据传输过程中,大家比较常用的包括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();
  }
}