使用DS2和JSON包时出错

时间:2016-10-05 15:54:56

标签: json sas sas-ds2

我正在尝试使用在SAS9.3维护3中为proc ds2提供的JSON包来解析一个JSON文件,根据Chris Hemedinger的博客文章:

http://blogs.sas.com/content/sasdummy/2015/09/28/parse-json-from-sas/

在重新开始我的SAS会话之前,一切似乎都运转正常,现在我继续收到消息:

ERROR: Compilation error.
ERROR: Line 883: Ambiguous method call for method createparser. Multiple method declarations
match the given argument list.

第883行(在本例中)是指包含createParser调用的行。这是一些可以重现错误的简化代码:

data have;
  set sashelp.class;
run;

proc ds2;
  data want;

    dcl package json j();   
    dcl int rc;

    method run();
      set have; 
      rc = j.createParser( name );
    end;

  enddata;
run;
quit;

我做错了什么?

2 个答案:

答案 0 :(得分:1)

根据文档(https://support.sas.com/documentation/cdl/en/ds2ref/68052/HTML/default/viewer.htm#n1w9ms65zrao57n1p1yt4029jcwt.htm),他们在createParser上使用方法重载。有4种方法可供选择,似乎SAS无法分辨出我试图调用的4个中的哪一个:

表格1:

package.CREATEPARSER ( );

表格2:

package.CREATEPARSER (json-text, tipping-size);

表格3:

package.CREATEPARSER (json-text);

表格4:

package.CREATEPARSER (tipping-size);

我找到了一个丑陋的解决方案,只需调用表单2即可使调用明确无误。我将引爆点设置为32767,因为我正在使用SAS表中的数据,并且结果都不会比这更长。最终代码:

proc ds2;
  data want (overwrite=yes);

    dcl package json j();   
    dcl int rc;

    method init();
      set have; 
      rc = j.createParser( name , 32767 );
    end;

  enddata;
%runquit;

答案 1 :(得分:1)

我认为你是对的,这是SAS的一个错误,我不认为有一种方法可以向SAS证实你使用方法3而不是方法4.只需声明name由于某些原因,角色不够。我会建议用SAS为这张票买票。

但是,我认为方法1优于方法2,因为您并不真正想要指定小费大小。只需将其移至INIT(无论如何它都属于)并使用setparserinput,如documentation中所述:

data have;
  set sashelp.class;
run;

proc ds2;
  data want;

    dcl package json j();   
    dcl double rc;
    method init();
      rc = j.createParser();
      j.setParserInput(name);
    end;

    method run();
      set have; 
    end;

  enddata;
run;
quit;

此外,看起来该示例的工作原因是character set参数。 UTF-8Unicode将起作用(后者实际上不会因其他原因而工作,但不会因原因而中断),而WLatin1,{{1 }}或ANSI不会。显然将其设置为UTF-8字符会导致SAS意识到它的真正特征吗?

ASCII