AX中执行对象反序列化时触发转换函数参数类型错误问题
Dynamics AX反序列化类型不匹配报错解决方案
报错信息Error executing code: Wrong type of argument for conversion function翻译为“执行代码错误:转换函数的参数类型错误”,是Dynamics AX/365FO中类型转换不匹配触发的典型报错,结合本地运行正常、其他环境运行异常的特征,可按以下方向排查修复:
- 首先校验
conpeek(nodeData, 1)的返回值类型:不同环境下容器nodeData的第一个位置存储的内容可能不一致,比如部分环境下该位置存的不是字符串类型,而是容器、int等其他类型,直接赋值给str类型变量sampleString时会隐式转换失败。建议先加类型校验逻辑,用typeOf(conpeek(nodeData, 1))判断返回值是否为Types::String,确认类型无误后再赋值。 - 反序列化方法的返回值类型匹配问题:
JsonConvert::DeserializeObject默认返回的是JToken类型,直接赋值给JArray类型变量时,不同环境的JSON结构差异会导致转换失败。比如本地环境的JSON字符串刚好是数组结构,而其他环境返回的是JSON对象、空值或者格式异常的字符串,无法转成JArray。建议先对反序列化结果做类型判断,可参考调整后的代码:
str sampleString; JToken jToken; JArray jArray; // 先校验容器取值类型 if (typeOf(conpeek(nodeData, 1)) == Types::String) { sampleString = conpeek(nodeData, 1); // 判空后再反序列化 if (sampleString != '') { jToken = JsonConvert::DeserializeObject(sampleString); // 校验反序列化结果是否为JArray类型 if (jToken is JArray) { jArray = jToken as JArray; } else { // 异常处理逻辑,比如记录日志 error("JSON格式不符合数组要求,实际内容:" + sampleString); } } } else { error("容器第一个值不是字符串类型,实际类型:" + enum2Str(typeOf(conpeek(nodeData, 1)))); }
- 环境配置差异:确认不同环境的Newtonsoft.Json版本、AX平台补丁版本是否一致,部分低版本平台对JsonConvert类的类型转换规则更严格,本地测试环境的补丁版本高于其他环境时也会出现本地正常其他环境报错的情况。
- 编码格式差异:不同环境下字符串的编码格式可能不同,比如生产环境返回的字符串带BOM头、特殊转义字符,本地环境没有这类字符,也会导致反序列化失败,建议对sampleString做编码清洗后再做反序列化。
内容的提问来源于stack exchange,提问作者Sairam
相关产品推荐
相关产品推荐

