目前在网络的数据传输过程中,大家比较常用的包括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生成xml1万594
xstream生成xml1万7969
json方式生成json1万3547
DOM生成xml10万4438
xstream生成xml10万78390
json方式生成json10万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();
  }
}