Groovy判断JSON中shortTerm/longTerm存在性并修复赋值代码错误
修复Groovy中
MissingPropertyException异常问题 问题场景
需要检查指定JSON文件中是否存在shortTerm和longTerm属性:
- 若存在,将对应
versionName值分别赋值给shortTerm、longTerm变量 - 若不存在,变量赋值为
'N/A'
现有Groovy代码执行时抛出异常,相关文件、代码及错误信息如下:
目标JSON文件
{ "component": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839", "componentName": "Apache Commons IO", "version": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839/versions/5425twrhjbsgjh947543734hfsdhugre8473", "versionName": "2.6", "origin": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839/versions/5425twrhjbsgjh947543734hfsdhugre8473/origins/82d1de62-fd7d-42cd-9cca-1b7d6d54cfc1", "originName": "2.6", "originExternalNamespace": "maven", "originExternalId": "commons-io:commons-io:2.6", "shortTerm": { "version": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839/versions/69624cfa-4d47-4dd6-bff3-deb5869d8145", "versionName": "2.17.0", "vulnerabilityRisk": { "critical": 0, "high": 0, "medium": 0, "low": 0 }, "origin": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839/versions/69624cfa-4d47-4dd6-bff3-deb5869d8145/origins/fbe4eb3b-31be-43de-aba5-d1362bf0cde7", "originName": "2.17.0", "originExternalNamespace": "maven", "originExternalId": "commons-io:commons-io:2.17.0" }, "longTerm": { "version": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839/versions/2a972758-8f30-4e87-b111-1b21ce063ea8", "versionName": "20030203.000550", "vulnerabilityRisk": { "critical": 0, "high": 0, "medium": 0, "low": 0 }, "origin": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839/versions/2a972758-8f30-4e87-b111-1b21ce063ea8/origins/1142e462-02d8-4d87-b3d2-e6f8e3f03a31", "originName": "20030203.000550", "originExternalNamespace": "maven", "originExternalId": "commons-io:commons-io:20030203.000550" }, "_meta": { "allow": ["GET"], "href": "https://bdhub.uat.com/api/components/829y58942yt8943hn8t943y89ty4389ht839/versions/5425twrhjbsgjh947543734hfsdhugre8473/origins/82d1de62-fd7d-42cd-9cca-1b7d6d54cfc1/upgrade-guidance", "links": [] } }
报错的Groovy代码
def upgradeJson = readJSON file:'upgrade.json' if (upgradeJson.containsKey('shortTerm')) { def shortTerm = upgradeJson.shortTerm.versionName def longTerm = upgradeJson.longTerm.versionName } else { def shortTerm = "NA" def longTerm = "NA" }
报错信息(中文翻译)
groovy.lang.MissingPropertyException: 类中不存在shortTerm属性
问题原因
- 变量作用域错误:
shortTerm和longTerm定义在if/else代码块内部,属于局部变量,块外无法访问,这是抛出异常的核心原因。 - 逻辑漏洞:仅判断
shortTerm是否存在,未单独校验longTerm,若JSON中存在shortTerm但缺少longTerm,仍会抛出属性不存在异常。 - 值不符合需求:赋值的是
"NA",但需求要求的是"N/A"。
修复后的代码
方案一:显式判断属性存在性
def upgradeJson = readJSON file:'upgrade.json' // 在代码块外部定义变量,确保作用域覆盖后续使用场景 def shortTerm = 'N/A' def longTerm = 'N/A' // 单独检查shortTerm属性 if (upgradeJson.containsKey('shortTerm')) { shortTerm = upgradeJson.shortTerm.versionName } // 单独检查longTerm属性 if (upgradeJson.containsKey('longTerm')) { longTerm = upgradeJson.longTerm.versionName }
方案二:使用Groovy安全导航+Elvis操作符(更简洁)
def upgradeJson = readJSON file:'upgrade.json' // 安全导航操作符?.避免空指针,Elvis操作符?:在值为null时返回默认值 def shortTerm = upgradeJson.shortTerm?.versionName ?: 'N/A' def longTerm = upgradeJson.longTerm?.versionName ?: 'N/A'
修复说明
- 作用域修复:变量定义在
if/else外部,确保后续代码可以正常访问。 - 逻辑严谨性:单独校验每个属性,避免因其中一个属性缺失导致异常。
- 简洁性优化:安全导航操作符
?.会在属性不存在时返回null,配合Elvis操作符?:可以一行完成判断+赋值,代码更简洁。 - 符合需求:默认值修正为
'N/A'。
内容的提问来源于stack exchange,提问作者Arpit Gupta
相关产品推荐
相关产品推荐

