我需要对同一个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);
}
这个答案旨在解决假设需要克隆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();/取决于实施情况。
...
}
据我所知,没有必要解析两次。只需将其解析一次,就可以将其转化为一个类型为 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
.