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

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属性

问题原因

  1. 变量作用域错误:shortTerm和longTerm定义在if/else代码块内部,属于局部变量,块外无法访问,这是抛出异常的核心原因。
  2. 逻辑漏洞:仅判断shortTerm是否存在,未单独校验longTerm,若JSON中存在shortTerm但缺少longTerm,仍会抛出属性不存在异常。
  3. 值不符合需求:赋值的是"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:44:51