如何在SAS中创建Json字符串



出于学习目的,我正在努力实现以下

场景:

我们有一个决策流,其中一个节点包含用于检查策略规则的规则流。规则基于if-else逻辑,其中规则可以是";拒绝"或";Review";,例如";规则602:如果customerAge <18 then Decision = 'Decline'。我收到了一张包含策略规则概述的表格。

表中的列为:

  • RULENUMBER(值:例如"602"(
  • RULELONGDESC(值:具有规则长描述的字符串(
  • RULESHORTDESC(值:包含规则简短描述的字符串(
  • RULECANBEOVERRULED(值:是/否(
  • 优先级(值:1-44(
  • 决策(值:审查/拒绝(

在执行决策流时,我们需要将策略规则检查的输出作为json字符串发送回。与以下示例非常相似:

DeclineDecision=cats(DeclineDecision,'{','"','RuleNumber','"',':','"',DeclineRuleNumber,'"',',','"','RuleText','"',':','"',DeclineRuleText,'"','},');
ReviewDecision=cats(ReviewDecision,'{','"','RuleNumber','"',':','"',ReviewRuleNumber,'"',',','"','RuleText','"',':','"',ReviewRuleText,'"','},');
ReviewDecision=substr(ReviewDecision,1,length(ReviewDecision)-1);
DeclineDecision=substr(DeclineDecision,1,length(DeclineDecision)-1);

练习:编写一个程序来创建JsonString。

我的出发点是政策规则表。在此基础上,我需要创建一个宏块,在其中我根据策略规则对表进行子集设置,并使用数组进行循环以创建json字符串。

Table下面是一个子集表,我需要将三个规则中每一个的所有值连接到一个json字符串中,就像上面的例子一样。按下图片链接

规则表

data policytable;
infile datalines dlm=',';
length rulelongdesc ruleshortdesc rulecanbeoverrulled $20. priority 8. decision $12.;
input rulenumber rulelongdesc$ ruleshortdesc$ rulecanbeoverrulled$ priority decision$;
datalines;
610,False Application,False,Yes,1,Review
602,Age < 18,Alder,No,1,Decline
639,Unknown address,Adresse,Yes,8,Decline
;
run;

我已经走了这么远。我应该如何解决这项任务?更具体地说,如何设置do while循环来创建字符串?目前,使用%put语句输出json字符串就足够了。我使用cats((还是catx((函数?substr((函数?

%let PolicyString = (602,610,639);
%macro json;
/*subsetting data based on rule number (policy string)*/
data work.testtable (replace=yes);
set work.policytable;
where rulenumber in &PolicyString;
run;
/*use do loop to create json string*/
%local i;
%let i=1;
%do %while(&i<4);
%put i = &i;
%let i = %eval(&i+1);
%end;

%mend;
%json;

如果使用proc json,可以将字符串写入临时位置,然后将其作为包含一个长字符串的宏变量读取。例如:

%let PolicyString = (602,610,639);
filename tmp temp;
proc json out=tmp nopretty nosastags;
export policytable(where=(rulenumber IN &PolicyString.) );
run;
data _null_;
infile tmp;
input;
call symputx('decision_json', _INFILE_);
run;
%put &decision_json.;

输出:

[{"rulenumber":610,"rulelongdesc":"False Application","ruleshortdesc":"False", ... }]

如果列需要是特定名称或按特定顺序,则可以首先创建一个具有所需列名和顺序的数据集,然后将其传递给proc json

请记住,宏变量最多可容纳65534个字符。如果你不希望你的字符串接近这个数量,你就不必担心。如果你这样做了,你需要通过拆分字符串或将JSON负载留在外部文本文件中,并通过proc http等其他方法发送来说明这一点。

最新更新