【ServiceNow】「JSON」とは何か?具体的にどう使う?

ServiceNow
T A

こんにちは。ServiceNow担当のT Aです。

ビジネスルールで取得したデータをイベントに渡して…
スクリプトインクルードに渡して…
APIを使用して外部連携…

スクリプト内でデータのやり取りをする際、思ったようにデータの受け渡しができないことがあるのではないでしょうか。
そんな時に役立つのがJSONです。
JSON形式に変換することで、受け渡しの際に発生する想定外の挙動を回避することができます。

今回の記事は、多少ServiceNowに詳しくなってきた開発者向けの内容となります。
JSON理解のきっかけとしていただければ幸いです。

JSONとは何か?

例えば以下のようなスクリプトで、オブジェクトのデータを出力してみましょう。

var grRec = new GlideRecord("incident");
var data = {
    "name": "山田",
    "work": "ServiceNow"
};gs.info("data : " + data); //dataのみでは出力不可
gs.info("------------------------------");
gs.info("data.name : " + data.name); //キーを指定で取得可能
gs.info("------------------------------");
gs.info("data.work : " + data.work); //キーを指定で取得可能

上記スクリプトの実行結果は次のようになります。

結果を見ると、オブジェクト全体を出力しようとすると[object Object]と出てしまっていて、本当に欲しいデータは出せていません。
このようにオブジェクト型のものを取得するときにはキーを指定しなければデータを取得できないのが普通です。

ではここでJSONを使用してみましょう。

JSONを使うといってもどうやって?と思うかもしれませんが簡単です。
変換したい変数をJSON.stringify()のカッコの中に入れるだけでOKです。
詳しくはスクリプトを見ていただいた方が早いでしょう。

var grRec = new GlideRecord("incident");
var data ={
    "name":"山田",
    "work":"ServiceNow"
};
var jsonString = JSON.stringify(data); //JSON形式に変換
gs.info(jsonString);

ご覧いただければわかる通り、オブジェクト型のままでは出力できなかった全体のデータが取得できるようになりました。

もちろん、JSON形式から元のオブジェクト型に戻すこともできます。

JSON型にした変数をJSON.parse()のカッコの中に入れるだけでOKです。

var grRec = new GlideRecord("incident");
var data = {
    "name": "山田",
    "work": "ServiceNow"
};
var jsonString = JSON.stringify(data); //JSON形式に変換
gs.info("------JSON型↓----------------");
gs.info(jsonString);
gs.info("------------------------------");
var stringData = JSON.parse(jsonString);//もとの形式に戻す
gs.info("-JSON型から元に戻した後↓-----------------");
gs.info("data : " + stringData);
gs.info("------------------------------");
gs.info("stringData.name : " + data.name);
gs.info("------------------------------");
gs.info("stringData.work : " + data.work);

これで、JSONの基礎は終了です。
「え?これだけ?データの出力がしやすくなるだけ?」と思いの皆さん、安心してください。
JSONを使用しなければいけないことがありますので、この後解説します。
いまは
①JSON.stringifyでJSON形式に変換できる。
②JSON.parseで元の形式に戻せる。
ということだけを覚えておいていただければOKです。

JSONを使用しなければいけない場面

ビジネスルール内で配列を作成し、それをイベントに引数として渡すとき(gs.eventQueue())に配列として渡しているハズなのに別の形式に変換されてしまいます。
ちなみにビジネスルールで作成した配列をスクリプトインクルードに引数として渡す場合にはそのまま配列形式となります。

このあたりの挙動についてはイベントに引数を渡す際のServiceNow内部の挙動が関係している(らしい)ですが理由解説は割愛します(というよりも詳しくはわかりません…)

試しに実施するスクリプトは以下です。ビジネスルールからイベントを呼び出し、メールを送付する形で動作確認をします。

まずはビジネスルールのスクリプト

var grRec = new GlideRecord("incident");
(function executeRule(current, previous /*null when async*/ ) {    var mailArrayData = ["メールアドレス", "ユーザー名", "ID", "ユーザーの上長", "ログインユーザー"];
    gs.info("test mailArrayData(BR): " + mailArrayData[0]);    gs.eventQueue("incident_change_test", current, mailArrayData);//配列形式のままデータを渡す})(current, previous);

続いてメールスクリプト

var grRec = new GlideRecord("incident");
(function runMailScript( /* GlideRecord */ current, /* TemplatePrinter */ template,
    /* Optional EmailOutbound */
    email, /* Optional GlideRecord */ email_action,
    /* Optional GlideRecord */
    event) {    var mailData = event.parm1;//parm1の中に配列情報がはいっているため受け取る    gs.info("test mailData(emailscript): " + mailData[0]);    template.print(mailData);

})(current, template, email, email_action, event);

ビジネスルールの時には「メールアドレス」というように値が取得できているのに、データを渡した後は「undefined」と言われてデータが出せなくなっていますね。

ではJSONを使用してこの状況を解決してみましょう。

ビジネスルール(改良版)はこちら

var grRec = new GlideRecord("incident");
(function executeRule(current, previous /*null when async*/ ) {    var mailArrayData = ["メールアドレス", "ユーザー名", "ID", "ユーザーの上長", "ログインユーザー"];
    gs.info("test mailArrayData(BR): " + mailArrayData[0]);    var jsonString = JSON.stringify(mailArrayData); //JSON形式に変換    gs.eventQueue("incident_change_test", current, jsonString);

})(current, previous);

続いてメールスクリプト(改良版)

var grRec = new GlideRecord("incident");
(function runMailScript( /* GlideRecord */ current, /* TemplatePrinter */ template,
    /* Optional EmailOutbound */
    email, /* Optional GlideRecord */ email_action,
    /* Optional GlideRecord */
    event) {    var mailData = event.parm1;
    var stringData = JSON.parse(mailData); //オブジェクトに変換    gs.info("test mailData(emailscript): " + stringData[0]);    template.print(stringData);

})(current, template, email, email_action, event);

やっていることとしてはJSON型に変換した後に引数として渡す⇒受取先のメールスクリプト内で元の方に戻す。を実施しているだけになります。

出力状況をみると正常に値が取得できているようですね。

終わりに

JSONの使用方法についていかがでしたでしょうか。

今回はJSONを使うとどんなことが起きるのか?実用的な場面としてはどんな時か?について解説をしました。

他にも重要な使用方法はあるとは思いますが、ひとまずイメージを掴むには十分ではないかと思います。

ServiceNowを活用した業務改善をするなら、システムサポートのServiceNow導入サービスをよろしくお願いいたします。

ServiceNowについてさらに詳しく知りたい方は、ServiceNowに熟知したSTSメンバーがより良いシステム構築をご提案しますので、ぜひご相談ください。

お問い合わせはこちら

記事を書いた人

T A

名古屋支社デジタルイノベーション事業部所属。犬派です。

関連記事

TOP