正如许多其他人所指出的,Java 没有将标准 JSON 解析库作为 JDK 的一部分提供,因此如果您想使用 JDK 捆绑技术而绝对没有依赖项,您有 3 个 XML 解析选择:
-
XPathFactory - 基于 XPath 的解析。将整个 XML 读入内存数据结构,并允许您使用 XPath expression language 对其执行查询。这可能是最慢和最占用内存的方式,但它是查询数据最方便的方式之一。您不会使用它编写股票交易应用程序,但如果您只需要来自大型配置文件的数据,它非常方便(尽管对于配置,还有许多其他特定的库比滚动您自己的更容易) .
-
DocumentBuilder - 基于 DOM 的解析。将整个 XML 读入内存中的数据结构,您可以根据需要进行查询和遍历。第二个最慢且相当占用内存的,但如果您希望/需要 XML DOM 留在内存中以便您可以对其进行操作,则这是必要的。如果您想读取、查询、进行更改并将 DOM 作为修改后的 XML 文件写回,也很方便。
-
SAXParser - 基于 SAX 的解析。几乎是最快的。每次命中适当的元素时,从上到下解析 XML,在您的 ContentHandler 实现中调用存根方法(在解析时提供)。这基本上就像一个健谈的人告诉你他们所做的一切。您可以自行决定是否实现已存根的方法,以便在找到数据时对其传递给您的数据进行实际处理。
-
XMLStreamReader - 最快的解析方法并使用最低的开销。这是 Java 中 XML 解析的新黄金孩子。它与 STAX 类似,但不是每次发现新内容时都调用存根方法,而是翻阅 XML 文件并在看到新内容时通知调用者其修改状态,但在您要求之前对内容不做任何事情.例如,它会说“现在我正在查看一个打开的标签……现在是一个关闭的标签……现在一些字符……现在是一个评论……”,除非你向它询问关于它所命中的那些元素(获取属性、字符等)它从未真正从流中解析和处理它们,它只是跳过它们。
现在,话虽如此,使用这些 API 尤其是如果您是新手,这并不是世界上最直观的。如果你以前用 Java 做过 XML 解析,那你就没事了。
如果你会考虑使用一个小型的 3rd 方 JAR,我会告诉你我的 Simple Java XML Parser (SJXP) library。它为您提供了 XPath 的易用性和 STAX 解析的性能;老实说(我是公正的,认真的)——太棒了。
我花了一年多的时间在这方面工作,同时编写了一个非常强大的 Feed 解析系统,该系统最初是一个基于 SAX 的系统,然后转向 STAX,我越是研究它,我就越意识到我可以轻松做到用简单的规则抽象出 STAX 的痛苦。
您可以查看Usage example,但您基本上定义了匹配规则,例如“/library/book/title”将解析您的所有标签内容;您可以解析属性甚至命名空间限定值(是的,它也支持命名空间!)
这是一个 RSS 提要解析器示例:
IRule linkRule = new DefaultRule(Type.CHARACTER, "/rss/channel/item/link") {
@Override
public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
// Also store the link, or something equivalently fancy
}
}
然后,您只需在创建时将该规则传递给解析器,如下所示:
XMLParser parser = new XMLParser(linkRule);
你就完成了;只需通过parse method 向解析器提供您的 XML 文件,每次匹配该路径时您都会收到回调。
我已经在 STAX 上对库的开销进行了基准测试、分析和优化,以至于它几乎不存在。实际的补丁匹配是通过缓存的哈希码完成的,所以我什至没有在解析器中进行字符串比较。
它是 really fast,它适用于 Android。
如果您想改为使用 JSON,我强烈建议您使用 GSON。 Jackson 更快,但 API 比 GSON API 复杂 37 倍。与 GSON 相比,您将花费更多时间来确定需要在 Jackson 中使用哪些类。
此外,自从上一次 GSON 版本和流解析器的重写以来,速度差距已经缩小了很多;如果这很关键,您可以使用他们的流解析器实现接近杰克逊的解析速度。
话虽如此,如果您需要超越任何东西的终极速度并且这是优先事项 #1,那么请使用 Jackson。