忍者ブログ

IT-Note

インフラ屋さんのメモ書き

ZabbixのAPIを使うVBAを作り直していく_03

第三回です。

今回は(2)のJSON形式の扱い方について記載をしていきます。
ちなみにですが、私は前回ツールを書くまで「JSON形式ってどんなものだろう」という
レベルの理解度でした。今も大してわかってません…


■前回までの記事
・第一回記事
・第二回記事


まずはJSON自体の説明は、外部リンクにお任せします。
要するにオブジェクトの中に要素があり、その要素に対して値がある、というのを
一定の記法であらわしたものだと理解してます。

■外部リンク

プログラミング経験がないので、「CSVのが扱いやすいなあ」とは思うのですが、
順番などを気にせず、要素名を指定して値が取り出せるのが特徴かなと思っています。
(CSVの場合、","で区切って何番目か、の番号だが、JSON形式は要素名で記載できる)

ここでは、実際にZabbix APIを使う時に出てくる文字列を使って、
VBAやVBSでそれら(JSON形式)をどう扱うかを書いていきます。

まずはサンプルを掲載しておきます。

■リクエスト文字列
{"auth":"7c513013dc0ce0504de9bac3927624c9","method":"trends.get","id":1,"params":{"itemids":"23660","time_from":"1437823800","time_till":"1437910200","output":"extend"},"jsonrpc":"2.0"}

■レスポンス文字列
{"jsonrpc":"2.0","result":[{"itemid":"23660","clock":"1437825600","num":"60","value_min":"2088","value_avg":"2162","value_max":"2304"},{"itemid":"23660","clock":"1437829200","num":"60","value_min":"2072","value_avg":"2151","value_max":"2552"},…(中略)…,"value_avg":"4208","value_max":"9456"}],"id":1}

これは、「ItemIDが23660のものの、2015/07/25 20:30 ~2015/07/26 13:30のトレンドデータを取得する」というリクエストをZabbixのAPIに対して送って、得られたレスポンスです。
レスポンスの文字列はこれが1行で返ってきます。
このままの文字列形式では、時間ごとに平均値(value_avg)のみを抽出したり、
計算したりするのが大変です。
なので、この"result":[ (文字列)] の文字列部分を、扱いやすいような形に直す必要があります。

人によると思いますが、わかりやすいのはこんな形ですよね。

itemid clock num value_min value_avg value_max
23660 1437825600 60 2088 2162 2304
23660 1437829200 60 2072 2151 2552

返ってきた文字列部分を構文解析(パース)すると、
下記のような表形式で結果を扱えるようになります。

配列/プロパティ itemid clock num value_min value_avg value_max
0 23660 1437825600 60 2088 2162 2304
1 23660 1437829200 60 2072 2151 2552
2

オブジェクト名.value_avg(1)=2151

上記はイメージなので、VBAでいきなりこの形での参照はできません。
実際に使うには、For Eachなどの要素総当たりで処理します。
なのでリクエスト側で範囲を絞って(時間とかフィルタとか)、
出てきた結果を全部処理するという感じで使うとよいと思います。

裏を返せば、これ(JSONパース)ができなければZabbixのAPIを十分に活用できない、という話になります。

JavaScriptなどにはjsonをパースできる関数が用意されているようなのですが、
VBAやVBSには標準では用意されていません。

なので、この部分は自分で書く、もしくはどこかから拝借してくる必要が出てきます。

色々とWebを探し回ったところ、32bitOSで使えるサンプルを見つけました。
■外部リンク VBAでJSONを扱う
■外部リンク VBAでjsonをパースする

ですが、昨今WindowsOSも標準が64bit化してますので、32bit限定のコードは使えなくなってきます。
※実際には32bitがどう、というより64bitOSでScriptControlというオブジェクトが無いのが問題

別サイトでいいものを見つけました。
■外部リンク1 VBSでのJSON解析(台湾の方のブログ)
■外部リンク2 Cybozu.com記事 

前者は特に非常にシンプルなコードになっています。
32bitOSで使えたScriptControl機能が64bitOSで消えてしまったので、
htmlfileオブジェクト経由で無理やり使う、というのが前者のやり方です。

オブジェクトの使い方の是非がよく分かっていませんが、
私の記事の中では、64bit対応側のリンク1側のものを使ってスクリプトを記述していきます。
将来的にはこの辺を自作したいなあと思いますが、まずは動かすところから…