Java内置的JSON或XML数据解析器

时间:2012-02-13 07:01:54

标签: java xml json

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

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

8 个答案:

答案 0 :(得分:17)

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

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

您可能希望减少使用外部库的恐惧。利用具有所需功能的现有库几乎总是更好,而不是自己编写。使用MavenIvy等工具自动计算和下载项目定义中的依赖项,实际上没有理由担心使用库。

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

答案 1 :(得分:10)

正如许多其他人所指出的那样,Java并没有将标准JSON解析库作为JDK的一部分提供,因此如果您想要使用JDK捆绑技术并且完全没有依赖关系,那么您有3种XML解析选择:< / p>

  • 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解析,那么你会没事的。

如果你会考虑一个小小的第三方JAR,我会指着你Simple Java XML Parser (SJXP) library。它通过STAX解析的性能为您提供了轻松的XPath;说实话(我是不偏不倚的,认真的) - 这太棒了。

我花了一年多的时间研究这个问题,同时编写了一个非常强大的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。杰克逊速度更快,但API比GSON API复杂37倍。你会花更多的时间来确定你需要在杰克逊使用哪些课程,而不是使用GSON。

此外,自从上一次GSON发布和流解析器的重写以来,速度差距已经被关闭了很多;如果这很重要,你可以使用他们的流解析器来获得接近Jackson的解析速度。

话虽如此,如果您需要超越任何优先级的ULTIMATE速度并且优先级为#1,那么请使用Jackson。

答案 2 :(得分:6)

我正在使用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

答案 3 :(得分:5)

您已经接受了,但是每个人似乎都错过了Java 拥有标准JSON库这一事实。从JDK 7开始,标准库中就有一个javax.json包。

答案 4 :(得分:1)

Java提供SAXParser来解析XML。

答案 5 :(得分:1)

如果您正在使用netbeans进行编程,则可以使用 dtd 生成xml扫描程序。只需用鼠标右键单击 dtd 文件,然后选择“生成DOM扫描程序”

答案 6 :(得分:0)

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

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

答案 7 :(得分:-1)

JSON非常棒,比XML更好。

为什么不想添加外部库?如果你真的无法使用,你可以重写一个解析器。只是实现一个解析器并不太难。