2012年12月13日木曜日

DynamicValue アクティビティで JSON データを扱う

Workflow Manager 1.0 によって大幅追加されたアクティビティのうち、DynamicValue 関係のアクティビティがあります。名前通り動的な値を扱うためのアクティビティなのですが、具体的にいうと JSON データに対しての操作が可能になるアクティビティ群です。

今回はそれらの中から、JSON 値を生成する BuildDynamicValue アクティビティと、JSON 値から指定したものの値を取得する GetDynamicValueProperties を利用してみます。

サンプルの JSON データとしてFacebook 上で作成されている CLR/H のサイトデータを利用します。Facebook の情報にアクセスするために Graph API を利用してアクセスします。

   1: https://graph.facebook.com/144924185576953

このようにアクセスすることで次のように情報が取得できます。

   1: {
   2:    "about": "CLR/H \u306f\u3001\u5317\u6d77\u9053\u3067 IT\u95a2\u9023\u3001\u7279\u306b\u958b\u767a\u7cfb\u6280\u8853\u306b\u95a2\u3059\u308b\u5b66\u7fd2\u3068\u7814\u7a76\u3092\u76ee\u7684\u3068\u3057\u305f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u3059\u3002\n",
   3:    "general_info": "\u672d\u5e4c\u3067\u6d3b\u52d5\u3057\u3066\u3044\u308b.NET\u3084MS\u30c6\u30af\u30ce\u30ed\u30b8\u4e2d\u5fc3\u306b\u52c9\u5f37\u4f1a\u3092\u958b\u50ac\u3057\u3066\u3044\u308b\u56e3\u4f53\u3067\u3059\u3002\n",
   4:    "is_published": true,
   5:    "talking_about_count": 18,
   6:    "website": "http://clr-h.jp/",
   7:    "were_here_count": 0,
   8:    "category": "Non-profit organization",
   9:    "id": "144924185576953",
  10:    "name": "CLR/H",
  11:    "link": "https://www.facebook.com/pages/CLRH/144924185576953",
  12:    "likes": 51,
  13:    "cover": {
  14:       "cover_id": 421089204627115,
  15:       "source": "http://sphotos-d.ak.fbcdn.net/hphotos-ak-ash4/s720x720/255021_421089204627115_2066584892_n.jpg",
  16:       "offset_y": 20
  17:    }
  18: }

今回はここから指定した値を抽出するワークフローを作成してみます。

   1: Sub Main()
   2:     Dim result As New Variable(Of String)
   3:     Dim response As New Variable(Of DynamicValue)
   4:     Dim picaddress As New Variable(Of String)
   5:  
   6:     'メインのワークフローの作成
   7:     Dim seq As New Sequence
   8:     seq.Variables.Add(response)
   9:     seq.Variables.Add(result)
  10:     seq.Variables.Add(picaddress)
  11:  
  12:     'BuildDynamicValue アクティビティで JSON 値の作成
  13:     Dim dvBuild As New BuildDynamicValue With {.Result = response}
  14:     'JSON の Dictionary を作成
  15:     Dim jsDic As New Dictionary(Of String, InArgument)
  16:     jsDic.Add("about", New InArgument(Of String)("CLR/H \u306f\u3001\u5317\u6d77\u9053\u3067 IT\u95a2\u9023\u3001\u7279\u306b\u958b\u767a\u7cfb\u6280\u8853\u306b\u95a2\u3059\u308b\u5b66\u7fd2\u3068\u7814\u7a76\u3092\u76ee\u7684\u3068\u3057\u305f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u3059\u3002\n"))
  17:     jsDic.Add("general_info", New InArgument(Of String)("\u672d\u5e4c\u3067\u6d3b\u52d5\u3057\u3066\u3044\u308b.NET\u3084MS\u30c6\u30af\u30ce\u30ed\u30b8\u4e2d\u5fc3\u306b\u52c9\u5f37\u4f1a\u3092\u958b\u50ac\u3057\u3066\u3044\u308b\u56e3\u4f53\u3067\u3059\u3002\n"))
  18:     jsDic.Add("is_published", New InArgument(Of String)("true"))
  19:     jsDic.Add("talking_about_count", New InArgument(Of String)("18"))
  20:     jsDic.Add("website", New InArgument(Of String)("http://clr-h.jp/"))
  21:     jsDic.Add("were_here_count", New InArgument(Of String)("0"))
  22:     jsDic.Add("category", New InArgument(Of String)("Non-profit organization"))
  23:     jsDic.Add("id", New InArgument(Of String)("144924185576953"))
  24:     jsDic.Add("name", New InArgument(Of String)("CLR/H"))
  25:     jsDic.Add("link", New InArgument(Of String)("https://www.facebook.com/pages/CLRH/144924185576953"))
  26:     jsDic.Add("likes", New InArgument(Of String)("51"))
  27:     dvBuild.Properties = jsDic
  28:     dvBuild.Result = response
  29:  
  30:     'GetDynamicValueProperties アクティビティで JSON 値から取得
  31:     Dim dv As New GetDynamicValueProperties With {
  32:         .Source = response
  33:     }
  34:     dv.Properties.Add("link", New OutArgument(Of String)(picAddress))
  35:  
  36:     '結果を標準出力に出力
  37:     Dim wl As New WriteLine With {.Text = picaddress}
  38:  
  39:     seq.Activities.Add(dvBuild)
  40:     seq.Activities.Add(dv)
  41:     seq.Activities.Add(wl)
  42:  
  43:     WorkflowInvoker.Invoke(seq)
  44:     Console.ReadLine()
  45:  
  46: End Sub

JSON 値の作成部分が長いロジックになりますが、これはワークフロー中で作成しようとしているからであって、普通は Web サービスから取得した結果をそのまま用いたりするのではないかと思います。

もちろんコードで行わなくとも・・・と、言いたかったのですがデザイナで利用しようとするとアクティビティのプロパティが一部表示されていない状態になってしまったので、現時点では利用できるかどうかはっきりしていません。今回、私が検証した環境が Windows 8 + Visual Studio 2010 Pro という環境で無理やりやりくりしたせいもあり、本当はプロパティも問題なくデザイナにも表示されるのかもしれませんが、まだ調べきれていません。

ただ仮にできるとした場合は次のようなワークフローになるかと思います。

DYnamicValueWF

Windows 8 になってからの数少ない不満が、ワークフローデザイナーの配色です・・・。

実行結果としては次のようになります。

DYnamicValueWF_Exec

このように非常に簡単に JSON 値を扱えるようになりますので、外部 Web サービスとの連携も今まで以上に行いやすくなるのではないでしょうか。

0 件のコメント:

コメントを投稿