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

sam*_*old 10 java xml json

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

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

iro*_*hon 17

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

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

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

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


Riy*_*lla 10

正如许多其他人所指出的那样,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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需在创建时将该规则传递给解析器,如下所示:

XMLParser parser = new XMLParser(linkRule);
Run Code Online (Sandbox Code Playgroud)

你完成了; 只需通过parse方法为解析器提供XML文件,每次匹配路径时都会得到回调.

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

非常快,适用于Android.

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

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

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


wlk*_*wlk 6

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

Gson gson = new Gson();
String xyzAsString = gson.toJson(xyz);
Run Code Online (Sandbox Code Playgroud)

反序列化JSON使用:

Gson gson = new Gson();
Classname xyz = gson.fromJson(JSONedString, Classname.class);
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请访问:https://sites.google.com/site/gson/gson-user-guide


jig*_*ggy 5

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

  • 它是JEE7的一部分,而不是JRE标准库 (5认同)