Java中的JSON解析或字符串解析是否更加昂贵?

时间:2017-10-27 14:00:17

标签: java json gson string-parsing

我正在尝试用Java动态解析大量数据。换句话说,我有大量不同类型的数据,因此我将它们放在String或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.

所以不要为80个左右的类(可以在任何给定时间添加/删除/更改更多)执行此操作,我计划将数据放入String或Json String中并解析出值(深度优先)。

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

1 个答案:

答案 0 :(得分:1)

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

案例1: 使用gson(映射到类)

为每个json输入创建实例

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

对于案例2,您不需要自己编写解析器:已有解析器可用。 我在这里写下一个杰克逊的例子(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也会提供不同名称的类似内容。 :)