如何克隆 `com.fasterxml.jackson.core.JsonParser`

How to clone `com.fasterxml.jackson.core.JsonParser`

我需要解析同一个 json 流两次,一次是识别 json 流中数组的长度,然后是解析实体。但是,只有一个 JsonParser 实例可以开始。有没有一种方法可以克隆它或创建它的副本,因为一旦使用该实例进行解析,显然就不能重新使用它来重新解析相同的 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);

    }

据我所知,没有必要解析两次。只需将其解析一次为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();   
}

或者,您可以从 json 节点解析到对象 ResultEntitiesContainer,如下所示:

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

备注:

  • 请仔细检查 ResultEntitiesContainer 是否应为 static

这个答案旨在解决克隆 JsonParser 的问题,假设它是必需的。

com.fasterxml.jackson.core.JsonParser is a public abstract class and it does not provide a clone 或类似的方法。 摘要 class 可以通过 JsonParser.java 的作者无法控制的不同实现来扩展。 同样,将 JsonParser 克隆为 void parseEntities(JsonParser parser); 的参数也是不安全的,因为 parseEntities 的作者无法确定使用了哪个实现以及是否可以克隆。

但是,如果您(作为 parseEntities 的作者)确实可以控制所使用的实现,那么克隆已知的实现是安全的(假设这是可能的)。 因此,如果您确实知道 class 将使用 JsonParser 的哪个特定实现(或多个实现),您可以尝试专门克隆这些已知的实现。 例如。添加并实施一种或多种方法(根据需要),例如:

void parseEntities(MyJsonParser parser);

void parseEntities(MyOtherJsonParser parser);

那么就是克隆使用的JsonParser具体实现的问题了。例如假设 MyJsonParser 支持克隆以下内容可能是有效的。

void parseEntities(MyJsonParser parser){

MyJsonParser clonedParser=parser.clone();//depends on implementation

...

}