我有一个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
?
答案 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}"
}
这里我们有一个包含6个对象的JSON数组。我们将此JSON解析为List<Map>
对象,然后我们将其拆分为大小为2的块并准备JSON以供稍后执行。我只使用了6个对象作为插图,但是如果初始列表包含100个对象并且我们分成大小为10的块也没关系 - 算法是相同的。
可以概括并按以下步骤进行描述:
上面显示的示例产生以下输出:
Sending following JSON object: [{"id":1},{"id":2}]
Sending following JSON object: [{"id":3},{"id":4}]
Sending following JSON object: [{"id":5},{"id":6}]