如何克隆 "com.fasterxml.jackson.core.JsonParser"?

问题描述 投票:0回答:1

我需要对同一个json流进行两次解析,一次是识别比如说json流中数组的长度,下次是解析实体。然而,只有一个JsonParser实例开始。我是否有办法可以克隆这个实例或者创建一个副本,因为一旦这个实例被用来解析,显然不能再用于重新解析同一个json流。先谢谢你。

举个例子,我需要解析同一个json流。


   static class ResultEntitiesContainer {
     List<ResultEntity> resultEntities;
     // getter and setters available
   }

    void parseEntities(JsonParser parser) {
      // Need to extract number of entities. 
      int count=0;
      ObjectMapper om = new ObjectMapper();
      JsonNode node = om.readTree(parser);
      node = node.get("resultEntities");
      if (node.isArray()) {
        count = node.size();
      }

      // Need to parse the entities in the json node
      ResultEntitiesContainer rec = om.readValue(parser, ResultEntitiesContainer.class);

    }

java json parsing fasterxml
1个回答
1
投票

这个答案旨在解决假设需要克隆JsonParser的问题。

com.fasterxml.jackson.core.JsonParser 是一个公共的抽象类,而且它没有提供一个 克隆 一个抽象类可能会被不同的实现扩展,而JsonParser.java的作者并不能控制这些实现。 void parseEntities(JsonParser parser); 因为作者 parseEntities 不能确定使用的是哪种实现,是否可以克隆。

然而,如果你(作为《》的作者)在 parseEntities)对所使用的实现有控制权,那么克隆已知的实现是安全的(假设这是可能的).因此,如果你确实知道你的类将使用JsonParser的哪些具体实现(或实现),你可以尝试并具体克隆这些已知的实现.例如,添加并实现一个或多个方法(根据需要),如。

void parseEntities(MyJsonParser parser);

void parseEntities(MyOtherJsonParser parser);

然后就是克隆使用的JsonParser的具体实现的问题。例如假设 MyJsonParser 支持克隆,下面可以有效。

void parseEntities(MyJsonParser parser) {

MyJsonParser clonedParser=parser.clone();/取决于实施情况。

...

}


0
投票

据我所知,没有必要解析两次。只需将其解析一次,就可以将其转化为一个类型为 ResultEntitiesContainer 并计算列表中的元素,得到 count. 你可以改变方法 parseEntities 如下所示。

void parseEntities(JsonParser parser) {
   ObjectMapper om = new ObjectMapper();

   // Need to parse the entities in the json node
   ResultEntitiesContainer rec = om.readValue(parser, ResultEntitiesContainer.class);
   // Need to extract number of entities. 
   int count = rec.getResultEntities().size();   
}

或者你也可以解析为对象 ResultEntitiesContainer 从json节点中获取如下信息。

ResultEntitiesContainer rec = om.treeToValue(node, ResultEntitiesContainer.class);

备注:

  • 请仔细检查是否 ResultEntitiesContainer 应是 static.
© www.soinside.com 2019 - 2024. All rights reserved.