【问题标题】:Dynamically create a TW object in IBM BPM在 IBM BPM 中动态创建 TW 对象
【发布时间】:2019-03-28 14:47:45
【问题描述】:
我正在使用 IBM BPM 8.6
我有一个输入字符串如下:
"\"RECORD_CONTACT\":\"Maram\" , \"DRUG\":\"Panadol\"
在服务器端的脚本中,我想像这样动态创建一个业务对象:
tw.local.recordContact = Maram;
tw.local.drug = Panadol;
如何动态创建业务对象?
【问题讨论】:
标签:
javascript
json
object
dynamic
business-process-management
【解决方案1】:
您的请求存在一些问题。首先是您不是在创建业务对象,而是在创建变量。在 IBM BPM 中,必须在设计时声明变量,否则会出现错误,因此调用尝试调用类似 -
tw.local.myVariable = 'Bob';
如果 tw.local.myVariable 尚未声明,将抛出异常。根据您在此处提出的其他问题(link),我假设您实际上有一个声明为“return”的 ANY 变量,以便
tw.local.return.myVariable = 'Bob'
会起作用。鉴于我基于 Sven 的回答,我认为以下内容会起作用(您需要验证)
var str = "\"RECORD_CONTACT\":\"Maram\" , \"DRUG\":\"Panadol\"";
var jsonStr = "{" + str.replace(/\\\"/g,'\"') + "}";
var tempValue = JSON.parse(jsonStr);
var keyArray = Object.keys(tempValue);
var valueArray = Object.values(tempValue);
for(var keyCount=0; keyCount<keyArray.length; keyCount++{
var evalString = "tw.local.return."+keyArray[keyCount]+"="+valueArray[keyCount];
eval(evalString);
}
我会注意到这样做是一个非常糟糕的主意,因为它会是非常脆弱的代码,并且以这种方式使用 eval() 会使您面临各种可能的漏洞。如果其中一个键的值不是简单类型,它也会失败。
-安德鲁·派尔
【解决方案2】:
应该知道您将如何处理动态创建的业务对象 (BO),以便更好地回答您。就像一种非常通用的方式一样 - 创建 JSON 对象而不是 BO。
但如果您想坚持使用 BO,那么只有在设计时事先了解所有 BO 结构(模式)时才有可能。
var str = "\"RECORD_CONTACT\":\"Maram\" , \"DRUG\":\"Panadol\"";
vat objArray = str.split("reg ex to split each object string")
foreach (obj in objArray ){
if(obj.indexOf( "RECORD_CONTACT")!=-1)
tw.local.recordContact = new tw.object.RECORD_CONTACT();
//below goes code get value of each attribute of BPM from string
}
else if(obj.indexOf( "DRUG")!=-1){
//similar code to create BO DRUG
}
在使用之前不要忘记创建 BO :)