java - Java 中的 JSON 解析或 String 解析更昂贵吗?

标签 java json gson string-parsing

我正在尝试用 Java 动态解析大量数据。换句话说,我有大量不同类型的数据,所以我将它们放在一个字符串或一个 JSON 字符串中(通过 GSON),而不是这样做:

switch(data){
case instanceof Class1:
     Class1 data = gson.fromJson(jsonString);
     //Do Stuff for class 1 layout
case instanceof Class2:
     Class2 data = gson.fromJson(jsonString);
etc.

因此,我计划将数据放入 String 或 Json String 中并解析出值(深度优先).

我在一台低端 PC(单核 Atom 处理器)上,我正在尝试减少我对 CPU 的负担,因此确定哪个会更快......使用拆分或使用递归 JSON 的正则表达式字符串操作解析器。

最佳答案

让我们讨论一下您在这里提到的两个案例:

案例 1: 使用 gson(映射到类)为每个 json 输入创建实例

案例 2:创建一个文档(或类似类型的对象)本身并尝试从那里访问数据。

对于情况 2,您不需要自己编写解析器:已有可用的解析器。 我将在这里写下一个 jackson 示例(gson 也必须有类似的东西):

String myJson = "{ \"type\" : \"foo\", \"class\" : 3 }";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode node = objectMapper.readValue(myJson, JsonNode.class);
JsonNode type = node.get("type");
System.out.println(type.asText());

根据我的经验,在这两种情况下,性能差异并不大,因为库可以非常有效地处理解析,但是如果您有很多不同类型的 JSON,那么创建它就没有任何意义每个 JSON 中的 POJO(如此多的映射!!)。

由于像 this 这样的性能原因,我个人没有使用 gson但是您可以使用 jackson 创建所谓的 ObjectMapper 并非常有效地使用它。我想 gson 中也应该有类似的东西。

唯一的缺点是每个字段现在都可以通过字符串输入访问,这可能会使您的代码有点不可读。

编辑:

如果你真的想遍历 json 的所有字段,你最终将不得不进行 DFS,但是使用 JsonNode 的 fields 方法仍然可以避免解析。

root.fields() 将返回一个包含其中条目的迭代器,然后可以按照答案 here 中的描述优雅地使用它.

请记住,gson 中也可以使用具有不同名称的类似内容。 :)

关于java - Java 中的 JSON 解析或 String 解析更昂贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46976860/

相关文章:

java - 要安装 kudu,我们需要安装 java 吗?

java.lang.IllegalStateException : Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2

java - Gson将一个字段转化为多个字段

java - GSON 不会反序列化对外部类的引用

java - 从基于 Java 的 Web 应用程序发送预定电子邮件的最佳方式是什么?

java - 正则表达式在Java中获取两个字符之间的文本

java - 在java中实例化递归定义的复合泛型类

c# - 当设置为 ReferenceLoopHandling.Ignore 时,json.net 不会忽略循环引用

json - 如何在 Flutter 中解码 Gzip Http 响应?

c# - 使用 JSON.Net 读取具有 NULL 处理的 JSON 属性