簡體   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