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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:26:24