XML 是 Android 上的一等公民,鉴于依赖于 XML 的 Web 服务的数量,这是个好事。很多服务还支持另一个流行格式 JSON。它通常比 XML 简洁一些,但也是人们可读的,使得它更易于使用,并且可以更轻松地将其用于调试使用它的应用程序。Android 包括一个 JSON 解析器。(您可以从 JSON.org 网站获得该解析器,只是要去除几个手机不需要的类)。
private class StockJsonParser extends BaseStockParser{ public StockJsonParser(){ super("json"); } @Override protected Stock[] doInBackground(String... symbols) { Stock[] stocks = new Stock[symbols.length]; try{ StringBuilder json = new StringBuilder(); BufferedReader reader = new BufferedReader( new InputStreamReader(getData(symbols))); String line = reader.readLine(); while (line != null){ json.append(line); line = reader.readLine(); } JSONObject jsonObj = new JSONObject(json.toString()); JSONArray stockArray = jsonObj.getJSONArray("stocks"); for (int i=0;i<stocks.length;i++){ JSONObject object = stockArray.getJSONObject(i).getJSONObject("stock"); stocks[i] = new Stock(object.getString("symbol"), object.getString("name"), object.getDouble("price")); } } catch (Exception e){ Log.e("DayTrader", "Exception getting JSON data", e); } return stocks; } } |
可以看到在 Android 中使用 JSON 解析器是多么简单。您将来自服务器的流转换成传递给 JSON 解析器的字符串。您遍历对象图并创建 Stock
像 DOM 一样,JSON 解析器可以用于内存密集型应用。在 JSONObject
,最后作为 Stock
Protocol buffers
在
private class StockProtoBufParser extends BaseStockParser{ public StockProtoBufParser(){ super("protobuf"); } @Override protected Stock[] doInBackground(String... symbols) { Stock[] stocks = new Stock[symbols.length]; try{ Stocks.Portfolio portfolio = Stocks.Portfolio.parseFrom(getData(symbols)); for (int i=0;i<symbols.length;i++){ stocks[i] = Stock.fromQuote(portfolio.getQuote(i)); } } catch (Exception e){ Log.e("DayTrader", "Exception getting ProtocolBuffer data", e); } return stocks; } } |
如 Stock
比较性能通常涉及某种微基准测试,此类基准测试很容易产生偏见或无意间得到不正确的结果。即使以公平方式设计微基准测试,很多随机因素也会对结果产生影响。尽管有这些问题,我还是要使用这样的微基准测试来比较 XML(大约 1300 ms)、JSON(大约 1150 ms)和 protocol buffers(大约 750 ms)。基准测试向服务器发送了一个关于 200 个股票的请求并测量了从发出请求到用于创建ListView
Adapter
图 2
图 3
回到
本文介绍了如何使用 Internet 上流行的两种数据格式 XML 和 JSON 的方方面面。还讲到了第三种可能性,protocol buffers。像软件工程中的其他内容一样,选择技术主要就是权衡利弊。当您为一个局限的环境(比如 Android)开发时,这些决定的结果往往被放大了。我希望您现在拥有的关于这些后果的额外知识能够帮助您创建出色的 Android 应用程序。