JSON 解析或字符串解析在 Java 中更昂贵吗?

Is JSON parsing or String parsing more expensive in Java?

我正在尝试动态解析 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.

因此,我打算将数据放入字符串或 Json 中,而不是 80 左右 类(在任何给定时间更多可能是 added/removed/changed) ] 字符串并解析出值(深度优先)。

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

让我们讨论一下您在此处提到的两种情况:

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

案例 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() 将 return 带有一个迭代器,其中包含条目,然后可以按照答案 here.

中所述优雅地使用

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