代码之家  ›  专栏  ›  技术社区  ›  Tacitus86

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

  •  2
  • Tacitus86  · 技术社区  · 8 年前

    我试图用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个类(在任何给定时间都可以添加/删除/更改更多)执行此操作。

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Parijat Purohit    8 年前

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

    案例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就没有任何意义了(映射太多了!!)。

    我个人没有与gson合作,因为性能原因,如 this 但是你可以使用jackson创建一个叫做ObjectMapper的东西,并非常有效地使用它。我认为在gson中也应该有类似的事情。

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

    编辑:

    fields JsonNode的方法。

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