【问题标题】:Java Built-in data parser for JSON or XML or else [closed]用于 JSON 或 XML 或其他的 Java 内置数据解析器 [关闭]
【发布时间】:2012-03-04 15:03:40
【问题描述】:

我想读取存储在文件中的数据。我还没有决定存储它的格式,但我正在寻找一种易于解析的格式。最初我以为我会使用 JSON,但似乎 Java 没有内置的 JSON 解析器。

存储的数据将是一堆记录,每条记录由一组字段组成。因此,将其存储在可以逐行读取的文本文件中是不够简单的。这就是为什么我认为我需要像 JSON 这样的东西。但我不想添加外部库只是为了解析格式。有什么建议?我是 Java 新手。

【问题讨论】:

标签: java xml json


【解决方案1】:

虽然 Java 许多没有标准 JSON 解析库,但有几个可用的库快速、可靠且易于使用。许多还允许您使用标准对象绑定方法,例如 JAXB 使用注释定义您的反序列化映射。

我自己更喜欢Jackson。 Google-GSon 也很受欢迎,你可以在这个question 中看到有人如何比较两者。

您可能不想害怕使用外部库。使用具有所需功能的现有库几乎总是比编写自己的库更好。使用 MavenIvy 等工具自动计算和下载项目定义中的依赖项,真的没有理由害怕使用库。

话虽如此,在 Java XML 支持的当前状态下,您应该会发现 XML 具有同等的可访问性。 This answer 提供了一个使用 javax.xml.parsers.DocumentBuilder 生成 DOM 的简单示例。

【讨论】:

【解决方案2】:

正如许多其他人所指出的,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。

【讨论】:

    【解决方案3】:

    我正在使用 GSON:http://code.google.com/p/google-gson/ 来解析 JSON, 它非常易于使用:

    Gson gson = new Gson();
    String xyzAsString = gson.toJson(xyz);
    

    反序列化 JSON 使用:

    Gson gson = new Gson();
    Classname xyz = gson.fromJson(JSONedString, Classname.class);
    

    更多示例请看这里:https://sites.google.com/site/gson/gson-user-guide

    【讨论】:

    • 请注意,您的示例显示了对 Java 对象进行序列化,而不是像原始海报那样进行解析。
    • 谢谢,我已经修改了答案
    【解决方案4】:

    您已经接受了,但似乎每个人都忽略了 Java 确实 具有标准 JSON 库的事实。从 JDK 7 开始,标准库中就有一个 javax.json 包。

    【讨论】:

    • 它是 JEE7 的一部分,不在 JRE 标准库中
    【解决方案5】:

    Java 提供SAXParser 用于解析 XML。

    【讨论】:

    • Java SE 提供:SAX (javax.xml.parsers)、DOM (javax.xml.parsers)、StAX (javax.xm..stream)、JAXB (javax.xml.bind) 和 XPath (javax.xml.xpath) 用于解析 XML .
    【解决方案6】:

    如果你在 netbeans 上编程,你可以使用 dtd 来生成 xml 扫描器。只需用鼠标右键单击 dtd 文件,然后选择“生成 DOM 扫描仪”

    【讨论】:

      【解决方案7】:

      javax.json 是 Java 包 - 另请注意,有一个非常轻量级的 Java 替代 SAX,称为 StAX (Streaming API for XML)

      在我看来,您建议的应用程序中的 JSON v XML 在很大程度上取决于您将如何处理数据以及您将如何处理它。例如,如果您要将数据发送到网页并且需要使用对象表示法来使用 JavaScript 处理它,那么 JSON 是显而易见的选择。如果您只想显示它,那么您可能需要考虑 XHTML - 并让您的后端选择要显示的内容。如果您在 B2B 应用程序中的各种行业计算机之间传输数据,您可能需要使用行业标准定义的 XML 和标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        相关资源
        最近更新 更多