首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取SubArray of Fasterxml Jackson ArrayNode

获取SubArray of Fasterxml Jackson ArrayNode
EN

Stack Overflow用户
提问于 2015-02-24 14:20:57
回答 2查看 2K关注 0票数 1

我需要一个ArrayNode对象的子数组,在Java中使用fasterxml。

更清楚的是,

  1. 我有一个快速100 ArrayNode对象,它包含100个对象。
  2. 例如,我有一个极限参数,比如说5。
  3. 可以用一种非常原始的方式完成,如下所示 ArrayNode arrayNodeRecProducts = (ArrayNode) recProducts;int arrayNodeSize = arrayNodeRecProducts.size();if (极限>= 0&极限< arrayNodeSize) { while (arrayNodeRecProducts.has(极限)){arrayNodeRecProducts.remove(极限);}}

转换为recProducts类型的“ArrayNode”对象是快速and杰克逊JsonNode,包含一个数组。

上面的工作原理,但相当低效,因为内部时间循环运行的"arrayNodeSize -限制“次数,在删除ArrayNode对象一个接一个。

是否有一个子数组操作,我们可以执行的ArrayNode或铸造JsonNode本身?

谢谢和问候..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-26 08:44:50

谢谢你的回答,你是对的,因为杰克逊不支持ArrayNodes的这种功能。因此,我所做的就是下载了Jackson数据库代码库,并深入了解了为什么它们没有为ArrayNodes提供这样的ArrayNodes功能(请告诉我,我指的是databind2.3.2)。

在内部,杰克逊将ArrayNode保存在JsonNode列表中,如下所示,

代码语言:javascript
复制
private final List<JsonNode> _children = new ArrayList<JsonNode>();

令我惊讶的是,由于某些原因,我无法理解,它们没有提供一个SubArray操作,可以通过使用这个包含的列表的subList方法轻松地完成该操作。例如,如下,

代码语言:javascript
复制
public List<JsonNode> subArray(int fromIndex, int toIndex) {
    return _children.subList(fromIndex, toIndex);
}

上面的方法可以让我从我所面临的麻烦中解脱出来,但它根本不包括在库中。

因此,我在代码库中所做的就是在运行时使用反射黑入这个私有列表,并在运行时调用subList操作,如下所示。

代码语言:javascript
复制
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?

票数 2
EN

Stack Overflow用户

发布于 2015-02-24 14:43:34

杰克逊没有这样的支持。

我将创建一个新的ArrayNode,并将其填充到极限,在大多数情况下这将更有效:

代码语言:javascript
复制
ArrayNode limited = objectMapper.createArrayNode();
for(JsonNode e : src) {
        limited.add(e);
        if (limited.size() == limit) {
            break;
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28698214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档