You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:45:48