我想读取存储在文件中的数据。我还没有决定存储它的格式,但我正在寻找一种易于解析的格式。最初我以为我会使用JSON,但似乎Java没有内置的JSON解析器。
存储的数据将是一堆记录,每个记录由一组字段组成。因此,存储在可以逐行读取的文本文件中并不够简单。这就是为什么我认为我需要像JSON这样的东西。但我不想只是为了解析格式而添加外部库。有什么建议?我是Java的新手。
答案 0 :(得分:17)
虽然Java很多没有标准 JSON解析库,但有几个库可用,快速,可靠且易于使用。许多还允许您使用标准对象绑定方法,例如JAXB,使用注释定义反序列化映射。
我自己更喜欢Jackson。 Google-GSon也很受欢迎,你可以看到有些人在这个question中比较两者。
您可能希望减少使用外部库的恐惧。利用具有所需功能的现有库几乎总是更好,而不是自己编写。使用Maven或Ivy等工具自动计算和下载项目定义中的依赖项,实际上没有理由担心使用库。
话虽如此,在Java XML支持的当前状态下,您应该发现XML可以同等访问。 This answer提供了使用javax.xml.parsers.DocumentBuilder
生成DOM的简单示例。
答案 1 :(得分:10)
正如许多其他人所指出的那样,Java并没有将标准JSON解析库作为JDK的一部分提供,因此如果您想要使用JDK捆绑技术并且完全没有依赖关系,那么您有3种XML解析选择:< / p>
现在,所有这一切,特别是如果你是新手,使用这些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更好。
为什么不想添加外部库?如果你真的无法使用,你可以重写一个解析器。只是实现一个解析器并不太难。