【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