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

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

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

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

我自己更喜欢jackson 。 Google-GSon也很受欢迎,您可以看到有些人在这个问题上如何比较这两者。

您可能希望不那么害怕使用外部库。 利用具有所需function的现有库几乎总是更好,而不是编写自己的库。 使用Maven或Ivy等工具自动计算和下载项目定义中的依赖项,实际上没有理由担心使用库。

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

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

  • XPathFactory – 基于XPath的解析。 将整个XML读入内存中的数据结构,并允许您使用XPath表达式语言对其执行查询。 这可能是最慢且占用最多的内存,但这是查询数据最方便的方法之一。 你不会用这个写一个股票交易应用程序,但是如果你只需要一个大配置文件中的数据,它就非常方便了(虽然对于配置,还有许多其他特定的库比你自己更容易) 。
  • 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)库 。 它通过STAX解析的性能为您提供了轻松的XPath; 说实话(我是公正的,认真的) – 这太棒了。

我花了一年多的时间研究这个问题,同时编写了一个非常强大的Feed解析系统,该系统从基于SAX的系统开始,然后转移到STAX,我工作的越多,我就越能意识到我能够轻松地抽象出来STAX的痛苦与简单的规则。

您可以查看Usage示例 ,但实际上您定义了匹配的规则,如“/ 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方法为解析器提供XML文件,每次匹配路径时都会得到回调。

我已经对STAX上的库的开销进行了基准测试,分析和优化,以至于它几乎不存在。 实际的补丁匹配是通过缓存的哈希码完成的,所以我甚至不在解析器中进行字符串比较。

它非常快 ,适用于Android。

如果你想做JSON,我强烈建议使用GSON。 jackson速度更快,但API比GSON API复杂37倍。 你会花更多的时间来确定你需要在jackson使用哪些课程,而不是使用GSON。

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

话虽这么说,如果你需要ULTIMATE速度超过任何东西并且优先级为#1,那么就使用Jackson。

我正在使用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 确实拥有标准JSON库的事实。 从JDK 7开始,标准库中就有一个javax.json包。

Java提供了SAXParser来解析XML。

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

javax.json是Java包 – 请注意,SAX有一个非常轻量级的Java替代品,称为StAX(XML的流式API) 。

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

JSON非常棒,比XML更好。

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