2015-02-24 119 views
1

我需要在Java中的fasterxml jackson中获取ArrayNode对象的子阵列。获取Fasterxml Jackson ArrayNode的子阵列

更清晰,

  1. 我有一个包含例如fasterxml杰克逊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”对象一个更快的xml jackson JsonNode并包含一个数组。

上面的工作,但效率相当低,因为内部while循环运行“arrayNodeSize - 限制”一次一个地删除ArrayNode对象的次数。

是否有一个子数组操作,我们可以在ArrayNode或CastNode JsonNode本身上执行?

谢谢,并关心..

回答

2

谢谢“亨里克”你的答案,你在这是正确的杰克逊不支持ArrayNodes的这种功能。所以我做的是我下载了Jackson数据绑定代码库,并仔细研究了为什么他们没有为ArrayNodes提供这样的SubArray功能(请注意,我指的是数据绑定2.3.2)。

内部,杰克逊保持在JsonNode列表如下的ArrayNode,

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

令我惊讶的是,由于某种原因,我无法理解,他们没有提供这可以通过使用很容易地完成一个子数组的操作这个包含列表的子列表方法。例如下面,

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); 
} 

我知道上面的代码不适用于所有情况,但对于我的情况,它工作正常。

与此同时,我知道这是违反我们谨慎的面向对象原则封装,但我可以忍受这一点,原因如下文所述。

Dosen't Reflection API break the very purpose of Data encapsulation?

0

在杰克逊没有这样的支持构建。

我将创建一个新ArrayNode并填写到了极限,这将在大多数情况下,更高效:

ArrayNode limited = objectMapper.createArrayNode(); 
for(JsonNode e : src) { 
     limited.add(e); 
     if (limited.size() == limit) { 
      break; 
     } 
    } 
+0

真,这是一个比我目前所面对的,因为这只能运行通过的“限制”中指定的次数更高效。但根据你的回答,在杰克逊没有其他办法做到这一点?我甚至愿意将源JsonNode更改为Jackson中的其他类型。谢谢您的帮助。 – 2015-02-24 17:43:50

+0

我很确定没有。你可以创建一个你自己的工具类。 – 2015-02-24 20:49:59

+0

再次感谢henrik。但是我找到了自己的解决方案,解决了我在答复中发布的具体问题。如果强制性5小时结束,我将自己的答案标记为答案,我会将其标记为答案。 – 2015-02-26 08:46:38