我需要一个ArrayNode对象的子数组,在Java中使用fasterxml。
更清楚的是,
转换为recProducts类型的“ArrayNode”对象是快速and杰克逊JsonNode,包含一个数组。
上面的工作原理,但相当低效,因为内部时间循环运行的"arrayNodeSize -限制“次数,在删除ArrayNode对象一个接一个。
是否有一个子数组操作,我们可以执行的ArrayNode或铸造JsonNode本身?
谢谢和问候..。
发布于 2015-02-26 08:44:50
谢谢你的回答,你是对的,因为杰克逊不支持ArrayNodes的这种功能。因此,我所做的就是下载了Jackson数据库代码库,并深入了解了为什么它们没有为ArrayNodes提供这样的ArrayNodes功能(请告诉我,我指的是databind2.3.2)。
在内部,杰克逊将ArrayNode保存在JsonNode列表中,如下所示,
private final List<JsonNode> _children = new ArrayList<JsonNode>();令我惊讶的是,由于某些原因,我无法理解,它们没有提供一个SubArray操作,可以通过使用这个包含的列表的subList方法轻松地完成该操作。例如,如下,
public List<JsonNode> subArray(int fromIndex, int toIndex) {
return _children.subList(fromIndex, toIndex);
}上面的方法可以让我从我所面临的麻烦中解脱出来,但它根本不包括在库中。
因此,我在代码库中所做的就是在运行时使用反射黑入这个私有列表,并在运行时调用subList操作,如下所示。
ArrayNode arrayNodeRecProducts = (ArrayNode) recProducts;
if (limit >= 0 && limit < arrayNodeRecProducts.size()) {
Field innerArrayNode = ArrayNode.class.getDeclaredField("_children");
innerArrayNode.setAccessible(true);
List<JsonNode> innerArrayNodeChildNodes = (List<JsonNode>) innerArrayNode.get(arrayNodeRecProducts);
List<JsonNode> limitedChildNodes = innerArrayNodeChildNodes.subList(0, limit);
innerArrayNode.set(arrayNodeRecProducts, limitedChildNodes);
}我知道上面的代码不会在所有的情况下都能工作,但是对于我的情况,它工作得很好。
同时,我知道这违反了我们精心保护的OO原则封装,但我可以接受的原因解释在下面的文章。
Dosen't Reflection API break the very purpose of Data encapsulation?
发布于 2015-02-24 14:43:34
杰克逊没有这样的支持。
我将创建一个新的ArrayNode,并将其填充到极限,在大多数情况下这将更有效:
ArrayNode limited = objectMapper.createArrayNode();
for(JsonNode e : src) {
limited.add(e);
if (limited.size() == limit) {
break;
}
}https://stackoverflow.com/questions/28698214
复制相似问题