java - 获取 Fasterxml Jackson ArrayNode 的子数组

标签 java arrays json jackson fasterxml

我需要在Java中的fasterxml jackson中获取ArrayNode对象的子数组。

更清楚地说,

  1. 我有一个 fastxml jackson ArrayNode 对象,其中包含例如 100 个对象。
  2. 我有一个限制参数,例如 5。
  3. 可以用非常原始的方式来完成,如下所示,

    ArrayNode arrayNodeRecProducts = (ArrayNode) recProducts;
    int arrayNodeSize = arrayNodeRecProducts.size();
    
    if (limit >= 0 && limit < arrayNodeSize) {
        while (arrayNodeRecProducts.has(limit)) {
            arrayNodeRecProducts.remove(limit);
        }
    }
    

转换为 ArrayNode 类型的“recProducts”对象是一个 fastxml jackson JsonNode 并包含一个数组。

上面的方法可以工作,但是效率很低,因为内部 while 循环在逐个删除 ArrayNode 对象时运行“arrayNodeSize - limit”次数。

我们是否可以对 ArrayNode 或转换后的 JsonNode 本身执行子数组操作?

感谢和问候..

最佳答案

感谢“henrik”的回答,您的回答是正确的,Jackson 不支持 ArrayNodes 的此类功能。所以我所做的就是下载了 Jackson databind 代码库,并深入了解了为什么他们不为 ArrayNodes 提供这样的 SubArray 功能(请注意,我指的是 databind 2.3.2)。

在内部,Jackson 在 JsonNode 列表中维护 ArrayNode,如下所示,

private final List<JsonNode> _children = new ArrayList<JsonNode>();

令我惊讶的是,出于某种我无法理解的原因,他们没有提供可以通过使用此包含列表的 subList 方法轻松完成的 SubArray 操作。例如如下,

public List<JsonNode> subArray(int fromIndex, int toIndex) {
    return _children.subList(fromIndex, toIndex);
}

上述方法本来可以让我摆脱所面临的麻烦,但它根本不包含在库中。

因此,我在代码库中所做的就是使用反射在运行时简单地侵入此私有(private)列表,并在运行时调用 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?

关于java - 获取 Fasterxml Jackson ArrayNode 的子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28698214/

相关文章:

ruby - 检查两个数组是否具有相同的内容(以任何顺序)

javascript - 当我改变一个变量的值时,另一个变量也在改变

java - Google 图表 API JSON 无效

javascript - 在 JQuery 中迭代深层 JSON

java错误: Could not find or load main class,但是我的代码,java版本,环境变量都OKAY

java - 当鼠标位于应用程序窗口之外时,从 swing 拖动(我的意思是图像,而不是位置)时是否可以更改鼠标光标?

c - 按数组中的数字删除数组,C

python - 返回非 json 对象作为 lambda 响应

java - 列表与 map 有何不同?

java - 尝试加载 infinispan 配置文件时出现 FileNotFound 异常