如何克隆 `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
...
}
我需要解析同一个 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
...
}