Groovy向JSON数组添加多键值对象出错,请求代码修正
问题
初始JSON结构:
{ "books": [] }
预期通过循环向books数组添加一个包含bookId、bookName、bookYear、bookPrice的对象,最终结果如下:
{ "books": [ { "bookId": "1", "bookName": "name1", "bookYear": "2010", "bookPrice": "5.00" } ] }
尝试的代码:
import groovy.json.* def json = new JsonSlurper().parseText('''{"books":[]}''') List<String> keys = Arrays.asList("bookId", "bookName", "bookYear", "bookPrice"); List<String> values = Arrays.asList("1", "name", "2010", "5.00"); for(int i = 0; i < keys.size(); i++) { String key = keys.get(i) String value = values.get(i) json.books << [key: value] } return JsonOutput.toJson(json)
得到的错误结果:
{ "books": [ { "bookId": "1" }, { "bookName": "name1" }, { "bookYear": "2010" }, { "bookPrice": "5.00" } ] }
修正方案
问题核心是循环内每次都向books数组插入单个键值对的新对象,而非把所有键值对整合到同一个对象后再添加到数组。
基础修正版代码
import groovy.json.* def json = new JsonSlurper().parseText('''{"books":[]}''') List<String> keys = Arrays.asList("bookId", "bookName", "bookYear", "bookPrice"); List<String> values = Arrays.asList("1", "name1", "2010", "5.00"); // 先创建空对象存储所有图书属性 def book = [:] for(int i = 0; i < keys.size(); i++) { String key = keys.get(i) String value = values.get(i) book[key] = value } // 将完整的图书对象添加到books数组 json.books << book return JsonOutput.toJson(json)
Groovy简化版代码
利用Groovy的集合特性可以更简洁地实现:
import groovy.json.* def json = new JsonSlurper().parseText('''{"books":[]}''') List<String> keys = ["bookId", "bookName", "bookYear", "bookPrice"] List<String> values = ["1", "name1", "2010", "5.00"] // 通过transpose和collectEntries快速生成键值对对象 def book = [keys, values].transpose().collectEntries() json.books << book return JsonOutput.toJson(json)
内容的提问来源于stack exchange,提问作者sarjaana
相关产品推荐
相关产品推荐

