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
相关产品推荐
相关产品推荐

