Thingworx返回含数组的JSON对象时运行终止问题咨询
解决Thingworx返回含数组的对象时停止运行的问题
我之前在Thingworx里也碰到过一模一样的坑,大概率是对象引用或序列化的问题导致的,给你几个实用的解决方案:
核心问题分析
Thingworx里的输入对象(比如Inputs.offers里的项)大多带有内部资源引用、元数据或者属于特殊的实体类型,直接把它们塞进新数组返回时,JSON序列化器处理这些非标准属性时会出错,甚至触发循环引用,导致Thingworx进程卡住。
可行解决方案
1. 深拷贝对象后再添加到数组
通过深拷贝剥离原对象的内部引用,只保留可序列化的纯数据:
var last = { plans: [] }; // 深拷贝目标对象,彻底断开和原资源的引用 var copiedOffer = JSON.parse(JSON.stringify(Inputs.offers[1])); last.plans.push(copiedOffer); // 批量添加的写法: // for (var i = 0; i < Inputs.offers.length; i++) { // var copy = JSON.parse(JSON.stringify(Inputs.offers[i])); // last.plans.push(copy); // } return last;
如果是Thingworx实体对象,也可以用内置克隆方法更稳妥:
var copiedEntity = Resources["EntityServices"].CloneEntity({ entity: Inputs.offers[1], ignoreAcl: true }); last.plans.push(copiedEntity);
2. 手动提取需要的字段,构造简化对象
如果不需要原对象的全部属性,只提取业务必需的字段,避免序列化冗余的内部属性:
var last = { plans: [] }; var targetOffer = Inputs.offers[1]; // 只保留你实际需要的字段 var simplifiedOffer = { offerId: targetOffer.offerId, name: targetOffer.name, price: targetOffer.price, validUntil: targetOffer.validUntil }; last.plans.push(simplifiedOffer); return last;
3. 先把Infotable转为普通数组
如果Inputs.offers是Thingworx的Infotable类型(不是普通JS数组),先转成可序列化的JSON数组再操作:
var last = { plans: [] }; // 将Infotable转为普通JSON数组 var offersArray = Inputs.offers.toJSON(); last.plans.push(offersArray[1]); return last;
排查小技巧
- 先测试返回
{ plans: [{}] }这种简单对象,确认是原对象的问题还是数组构造的问题; - 用Thingworx的Script Debugger分步执行,看在
push或赋值后、返回前是否已经出现异常; - 检查原对象是否存在循环引用(比如对象里的某个属性指向自身或父级对象)。
内容的提问来源于stack exchange,提问作者Yasin Yörük
相关产品推荐
相关产品推荐

