如何将指定JSON转换为Groovy对象列表?使用map方法遇问题
Groovy中将JSON转换为对象列表的实现方案
方案一:自定义实体类映射
先根据JSON结构定义对应的实体类,再通过JsonSlurper解析JSON后,用collect方法将每个JSON对象转换为自定义实体对象。
// 定义对应JSON结构的实体类 class Askey { String ad int bt } class IdInfo { // 避免与Groovy内置标识符冲突,改用IdInfo命名 int mc int zs } class Item { Askey askey IdInfo Id } // 解析并转换JSON import groovy.json.JsonSlurper def jsonContent = ''' [ { "askey": { "ad": "000001", "bt": 1 }, "Id": { "mc": 30, "zs": 476 } } ] ''' def jsonSlurper = new JsonSlurper() def rawJsonList = jsonSlurper.parseText(jsonContent) // 转换为自定义对象列表 List<Item> itemList = rawJsonList.collect { jsonObj -> new Item( askey: new Askey( ad: jsonObj.askey.ad, bt: jsonObj.askey.bt ), Id: new IdInfo( mc: jsonObj.Id.mc, zs: jsonObj.Id.zs ) ) } // 验证结果 itemList.each { item -> println "askey: ad=${item.askey.ad}, bt=${item.askey.bt}" println "Id: mc=${item.Id.mc}, zs=${item.Id.zs}" }
方案二:使用动态对象(Expando)
如果不想提前定义实体类,可以用Groovy的Expando创建动态对象,灵活完成转换:
import groovy.json.JsonSlurper def jsonContent = ''' [ { "askey": { "ad": "000001", "bt": 1 }, "Id": { "mc": 30, "zs": 476 } } ] ''' def jsonSlurper = new JsonSlurper() def rawJsonList = jsonSlurper.parseText(jsonContent) // 转换为动态对象列表 def dynamicItemList = rawJsonList.collect { jsonObj -> def askeyObj = new Expando( ad: jsonObj.askey.ad, bt: jsonObj.askey.bt ) def idObj = new Expando( mc: jsonObj.Id.mc, zs: jsonObj.Id.zs ) new Expando(askey: askeyObj, Id: idObj) } // 验证结果 dynamicItemList.each { item -> println "askey: ad=${item.askey.ad}, bt=${item.askey.bt}" println "Id: mc=${item.Id.mc}, zs=${item.Id.zs}" }
常见失败原因说明
之前使用map方法未成功,大概率是因为未处理嵌套结构的转换,或是直接尝试将JSON对象映射到未定义的实体类上,导致无法正确赋值。上述两种方案均针对嵌套结构做了逐层转换,能解决这类问题。
内容的提问来源于stack exchange,提问作者Jose Martins
相关产品推荐
相关产品推荐

