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

Groovy脚本问题:JSON三级子节点访问及布尔值转换失败求助

问题描述

需要将给定JSON中以下节点的字符串类型"true"/"false"转换为布尔值:

  • billingAddress
  • shippingAddress
  • duplicate

给定JSON结构:

{    
    "active": "true",    
    "groups": {        
        "uid": "zzzz",        
        "integrationKey": " "    
    },    
    "name": "ancd",    
    "addresses": [        
        {            
            "town": "ewqe",            
            "shippingAddress": "true",            
            "postalcode": "1234",                        
            "region": {                
                "isocode": "US-MI",                
                "country": {                    
                    "isocode": "US",                    
                    "integrationKey": ""                
                }            
            },            
            "district": "",                        
            "streetnumber": "",            
            "billingAddress": "false",            
            "duplicate": "false",            
            "company": "dasdsfsdf",                        
            "fax": "",            
            "pobox": "",            
            "phone1": "",            
            "cellphone": ""                        
        },        
        {            
            "town": "d",            
            "shippingAddress": "true",            
            "postalcode": "1234",                        
            "region": {                
                "isocode": "US-MI",                
                "country": {                    
                    "isocode": "US",                    
                    "integrationKey": ""                
                }            
            },            
            "district": "",            
            "streetname": "absnadbasnd",            
            "streetnumber": "",            
            "billingAddress": "false",            
            "duplicate": "false",            
            "company": "dmnsmnmnfmfn",            
            "fax": "",            
            "pobox": "",            
            "phone1": "",            
            "cellphone": "",            
            "publicKey": "zxzx_3390_00_00|zxzx|KNA1|WE"                        
        }    
    ]
}

尝试转换时出现错误,错误信息:

java.lang.Exception: java.lang.IllegalArgumentException: argument type mismatch@ line 18 in script2.groovy

使用的Groovy脚本:

import java.util.HashMap;
import groovy.json.JsonSlurper;
import groovy.json.*

def Message processData(Message message) {     
    def body = message.getBody(java.lang.String) as String ;
    def data = new JsonSlurper().parseText(body);
    data.active = convertToBoolean(data.active);
    data.buyer = convertToBoolean(data.buyer);
    data.addresses.shippingAddress = convertToBoolean(data.addresses.shippingAddress);
    // data.replaceAll("false", false);
    // data.replaceAll("true", true);     
    // data.replaceAll[:"true", :true] ;
    // data.replaceAll[:"false", :false];
    message.setBody(new JsonBuilder(data).toPrettyString());
    return message;
}

//Boolean Conversion
static Object convertToBoolean(Object inputValue){        
    if(inputValue.equals("true")){          
        return true;        
    }else{          
        return false;        
    }
}
问题分析与解决

错误原因

第18行data.addresses.shippingAddress报错,核心原因是addresses是数组类型,不能直接通过.访问数组内对象的属性,必须遍历数组中的每个元素逐个处理;另外原脚本中data.buyer在给定JSON中不存在,会触发空指针问题。

修正后的脚本

import groovy.json.JsonSlurper;
import groovy.json.JsonBuilder

def Message processData(Message message) {     
    def body = message.getBody(java.lang.String) as String ;
    def data = new JsonSlurper().parseText(body);
    
    // 处理顶层的active字段
    if (data.active) {
        data.active = convertToBoolean(data.active);
    }
    
    // 遍历addresses数组,逐个处理目标字段
    if (data.addresses) {
        data.addresses.each { address ->
            address.shippingAddress = convertToBoolean(address.shippingAddress);
            address.billingAddress = convertToBoolean(address.billingAddress);
            address.duplicate = convertToBoolean(address.duplicate);
        }
    }
    
    message.setBody(new JsonBuilder(data).toPrettyString());
    return message;
}

// 布尔值转换方法,增加空值判断提升健壮性
static Boolean convertToBoolean(Object inputValue){        
    if (inputValue == null) {
        return false; // 可根据业务需求调整为null
    }
    return inputValue.equalsIgnoreCase("true");
}

关键修改点

  • 用each循环遍历addresses数组,确保每个地址对象的三个目标字段都被转换
  • 删除不存在的data.buyer相关代码,避免空指针异常
  • 转换方法增加空值判断,防止传入null时触发报错
  • 使用equalsIgnoreCase兼容大小写不同的字符串(如"True"、"TRUE")

内容的提问来源于stack exchange,提问作者pooj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:17:05