将列表添加到Json ObjectNode

时间:2015-12-12 13:24:15

标签: java json

ObjectNode row = Json.newObject();
row.put("0", a);
row.put("1", x);
row.put("2", y);

现在我有了清单

List<String> list = new ArrayList<String>();

如何将其添加到行?

2 个答案:

答案 0 :(得分:7)

您可以使用putArray方法创建ArrayNode。然后你应该用你的列表中的元素填充它。

ArrayNode arrayNode = row.putArray("myList");
for (String item : list) {
    arrayNode.add(item);
}

答案 1 :(得分:1)

这是创建arrayNode并从流中填充元素的一种实​​用方法。它与上述fracz答案相同:

    yourStringList.stream()
        .collect(Collector.of(
            () -> row.putArray("myList"), 
            (arrayNode, item) -> arrayNode.add(item), 
            (arrayNode1, arrayNode2) -> { arrayNode1.addAll(arrayNode2);  return arrayNode1; },
            Collector.Characteristics.IDENTITY_FINISH
        ));

从本质上讲,它定义了一个自定义收集器来累积流提供的元素。一些解释:

  • 第一个参数() -> row.putArray("myList")定义了一个函数,该函数将提供用于累积项目的对象(称为 supplier 函数)。在我们的例子中,此函数将提供ArrayNode,相当于上述答案中的ArrayNode arrayNode = row.putArray("myList");语句。
  • 第二个参数(arrayNode, item) -> arrayNode.add(item)定义 accumulator 函数,其作用是添加元素。在->运算符的左侧,第一个变量(例如arrayNode)引用第一个参数中定义的容器,而第二个变量(例如item)引用要累加的元素由流提供。在上例中,此函数与循环内的语句arrayNode.add(item);相同。
  • 第三个参数(arrayNode1, arrayNode2) -> { arrayNode1.addAll(arrayNode2); return arrayNode1; } combiner 函数,如果以并行方式收集流(例如,如果我们使用.parralelStream()而不是.stream(),则使用该函数) )。它的作用是将两个累加器合并在一起,这就是为什么该函数具有两个相同类型的小数的原因。我们定义此函数,以便将第二个累加器中累加的所有元素添加到第一个累加器中,并返回第一个累加器。
  • 第四个参数Collector.Characteristics.IDENTITY_FINISH定义了该过程的一个或多个opton。在这种情况下,IDENTITY_FINISH仅声明不提供任何 finisher 函数(以进一步处理累加器对象),或者换句话说,finisher函数是恒等函数(不处理)完成)。

乍一看,此解决方案似乎更复杂,但它利用了函数式编程的所有功能。例如,在收集所有内容之前,我们可以流对象,使用map函数,filter提取String属性,等等。

    yourObjectList.stream()
        .map(o -> o.getTheStringProperty())
        .filter(o -> o.length() > MIN_SIZE)
        .collect(Collector.of(
            () -> row.putArray("myList"), 
            (arrayNode, item) -> arrayNode.add(item), 
            (arrayNode1, arrayNode2) -> { arrayNode1.addAll(arrayNode2);  return arrayNode1; },
            Collector.Characteristics.IDENTITY_FINISH
        ));