如何将JSON文档数组拆分为固定大小的块?

时间:2018-04-10 06:03:00

标签: json groovy jsonslurper

我有一个JSON文档,表示一个包含100个对象的数组,我需要批量处理这个文档,例如:每批10件物品。

def text = '[{1st},{2nd},{3rd},{4th},...{100th}]'
def json = new groovy.json.JsonSlurper().parseText(text)

现在我需要从text[{1st},{2nd},..{10th}])中获取前10个元素并将其发布到Web服务中,然后再发布10个([{11th},{12th}...{20th}])等等。

我已经在C#中尝试过这种方法但在Groovy中无法做到这一点。

任何人都建议我send batches of json的最佳方式,每次json的总数发生变化dynamically

1 个答案:

答案 0 :(得分:1)

Groovy通过DefaultGroovyMethods类添加Iterable.collate(int size)方法,您可以使用它将输入数组拆分为n个大小的块,例如。

['a','b','c','d','e'].collate(3) == [['a','b','c'], ['d','e']]

请考虑以下示例:

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

final String text = '[{"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}]'

final List<Map> json = new JsonSlurper().parseText(text) as List<Map>

json.collate(2).each { part ->
    final String out = JsonOutput.toJson(part)

    println "Sending following JSON object: ${out}"
}

Run in Groovy web console

这里我们有一个包含6个对象的JSON数组。我们将此JSON解析为List<Map>对象,然后我们将其拆分为大小为2的块并准备JSON以供稍后执行。我只使用了6个对象作为插图,但是如果初始列表包含100个对象并且我们分成大小为10的块也没关系 - 算法是相同的。

可以概括并按以下步骤进行描述:

  1. 解析对象的初始JSON数组
  2. 将数组拆分为大小为10的块
  3. 将10个对象的块格式化为JSON字符串
  4. 处理JSON文档
  5. 上面显示的示例产生以下输出:

    Sending following JSON object: [{"id":1},{"id":2}]
    Sending following JSON object: [{"id":3},{"id":4}]
    Sending following JSON object: [{"id":5},{"id":6}]