繁体   English   中英

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

[英]How to clone `com.fasterxml.jackson.core.JsonParser`

I need to parse the same json stream twice, one time to identify say the length of array in the json stream, and next to parse the entities. 但是,只有一个 JsonParser 实例可以开始。 有没有办法我可以克隆它或创建它的副本,因为一旦实例用于解析,它显然不能用于重新解析相同的 json stream。 提前致谢。

例子:


   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);

    }

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

com.fasterxml.jackson.core.JsonParser是一个公共抽象 class 并且它不提供克隆或类似方法。 抽象的 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 解析器){

MyJsonParser clonedParser=parser.clone();//取决于实现

...

}

据我所知,没有必要解析两次。 只需将其解析为 ResultEntitiesContainer 类型的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 节点解析为 object ResultEntitiesContainer ,如下所示:

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

评论:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM