使用Groovy JsonSlurper解析JSON对象数组时遇MissingPropertyException的解决方法
修复Groovy解析国家JSON数组的MissingPropertyException问题
这个问题很常见,核心原因是你遍历的不是countries数组里的国家对象,而是外层JSON对象的键值对条目。
让我帮你拆解一下:你的JSON结构外层是一个包含countries键的对象,当你用JsonSlurper.parseText()解析后,countries变量其实是一个LinkedHashMap——它的键就是"countries",值才是你真正需要的国家数组。这时候直接调用countries.each,Groovy会遍历这个Map的所有Entry(也就是键值对),每个country变量其实是LinkedHashMap$Entry类型,自然没有sortname和name属性,所以抛出了异常。
修复方案:遍历正确的数组
只需要调整遍历的对象,先获取到countries键对应的数组,再遍历里面的每个国家对象:
String countriesJson = new File(classLoader.getResource('countries.json').getFile()).text def parsedData = new JsonSlurper().parseText(countriesJson) // 重点:遍历parsedData.countries这个数组,而不是外层的Map parsedData.countries.each { country -> String sortname = country.sortname String name = country.name // 在这里处理你的业务逻辑 println "国家代码:${sortname},名称:${name}" }
可选优化:直接解析文件(更简洁)
你也可以用JsonSlurper的parse()方法直接读取文件,省去手动读取文本的步骤:
def parsedData = new JsonSlurper().parse(classLoader.getResource('countries.json')) parsedData.countries.each { country -> String sortname = country.sortname String name = country.name // 处理逻辑 }
进阶:用Groovy类映射JSON对象(更规范)
如果希望代码更清晰、类型更安全,可以定义一个简单的Groovy类来映射国家对象:
@Canonical class Country { String id String sortname String name } // 解析时直接转换为List<Country> def countries = new JsonSlurper().parse(classLoader.getResource('countries.json')) .countries .collect { new Country(it) } countries.each { country -> println "ID: ${country.id}, 代码: ${country.sortname}, 名称: ${country.name}" }
这样后续处理国家对象时,IDE还能提供代码补全,减少出错概率。
内容的提问来源于stack exchange,提问作者smeeb
相关产品推荐
相关产品推荐

