如何克隆`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);
}

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

com.fasterxml.jackson.core.JsonParser是一个公共抽象类,它不提供克隆或类似方法。抽象类可以通过JsonParser.java的作者无法控制的不同实现进行扩展。同样,克隆JsonParser作为void parseEntities(JsonParser parser);的参数也是不安全的,因为parseEntities的作者无法确定使用了哪个实现以及是否可以克隆它。

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

void parseEntities(MyJsonParser parser);

void parseEntities(MyOtherJsonParser parser);

然后是克隆所使用的JsonParser的特定实现的问题。例如,假设MyJsonParser支持克隆,则以下内容可能是有效的。

void parseEntities(MyJsonParser解析器({

MyJsonParser clonedParser=parser.clone((//取决于的实施

}

据我所见,不需要解析两次。只需将其解析为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

最新更新