使用 DS2 和 JSON 包时出错

Error using DS2 and JSON package

我正在尝试根据 Chris Hemedinger 的博客 post 在 SAS9.3 Maintenance 3 中使用为 proc ds2 提供的 JSON 包解析出 JSON 文件这里:

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;

我做错了什么?

根据文档 (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);

我找到了一个丑陋的解决方案,它只是调用 Form 2 以使调用明确无误。我将临界点设置为 32767,因为我正在处理 SAS 表中的数据,结果 none 无论如何都会比这更长。最终代码:

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;

我认为你是对的,这是 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 会工作(后者实际上不会因为其他原因工作但不会因为 这个 原因而中断),而 WLatin1ANSIASCII 不会。显然将它设置为 UTF-8 字符会导致 SAS 意识到它真的是字符?

data have;
  set sashelp.class;
run;

proc ds2;
  data want(overwrite=yes);

    dcl package json j();   
    dcl char(50)  character set utf8 name;
    dcl double rc;
    method init();
      rc = j.createParser( name );
    end;

    method run();
      set have; 
    end;

  enddata;
run;
quit;