【SAS】PROC DS2でhttpのgetとJSONのパースをやってみた

同じ状況になる人はあまり居ないと思いますが、SASからREST APIを使ってJSON形式で情報を取ってきた後、JSONをパースしてデータセットに格納しています。

proc ds2;
  data xxx (overwrite=yes);
    /* GlobalでJSONパッケージインスタンスの宣言 */
    dcl package json j();
    
    /* 書き出す変数の宣言 */
    dcl bigint MODIFICATION_TIME having format 16.0;
    dcl nvarchar(128) PATH_SUFFIX;
    
    /* http GETのユーザ関数定義 */
    method getResponse(varchar(32767) URL) returns varchar(32767);
      /* ローカルでhttpパッケージインスタンスの宣言 */
      dcl package http webQuery();
      /* GETで返ってくる値を格納する変数 */
      dcl varchar(32767) character set utf8 RESPONSE;
      /* return code */
      dcl integer rc;
      rc = 0;
      /* GETを生成 */
      webQuery.createGetMethod(URL);
      /* GETを実行 */
      webQuery.executeMethod();
      /* 返ってきた値のbodyを文字値で取得 */
      webQuery.getResponseBodyAsString(RESPONSE, rc);
      return RESPONSE;
    end;
    
    /* parseJSONのユーザ定義関数 */
    method parseJSON(package json j); *packageを引数で渡す場合の動作がまだよく分かっていない;
      /* JSONパッケージで返ってくる値を格納する変数 */
      dcl int tokenType parseFlag rc;
      dcl nvarchar(128) token;
      rc = 0;
      
      /* JSONの最後までループ */
      do while (rc = 0);
        j.getNextToken(rc, token, tokenType, parseFlags);
        
        /* 取得したいmodification timeを格納 */
        if (token = 'modificationTime') then do;
          j.getNextToken(rc, token, tokenType, parseFlags);
          MODIFICATION_TIME = token;
        end;
        
        /* 取得したいpathSuffixを格納 */
        if (token = 'pathSuffix') then do;
          j.getNextToken(rc, token, tokenType, parseFlags);
          PATH_SUFFIX = token;
          /* 1行分の処理が終わったところでoutput */
          output;
        end;
      end;
    end;
    
    method init(); *runが適当?;
      dcl varchar(32767) character set utf8 URL RESPONSE;
      dcl int rc tokenType parseFlags;
      dcl nvarchar(128) token;
      rc = 0;
      
      /* 指定したURLで返ってくるJSONをRESPONSEに格納 */
      URL = 'http://xxx/yyy/?op=LISTSTATUS';
      RESPONSE = getResponse(URL);
      put 'URL:' URL;
      put 'Response:' RESPONSE;
      /* RESPONSEをJSONオブジェクトにセット */
      rc = j.createParser(RESPONSE);
      j.getNexToken(rc, token, tokenType, parseFlags);
      /* 今回はFileStatusをパースしたい */
      if (token = 'FileStatus') then do;
        parseJSON(j);
      end;
    end;
    
    /* JSONパッケージオブジェクトの破棄 */
    method term();
      dcl int rc;
      rc = j.destroyParser();
    end;
  enddata;
  run;
quit;

ds2は他のプログラミング言語のように書けるので、変数のスコープを意識しましたが、packageオブジェクトのスコープがよく分かりませんでした。
Packages and Scope

参考にしたサイトblogs.sas.com