【FileMaker】FileMaker 16のJSONで楽をする郵便番号検索実装（１）

FileMaker 16の新しい機能の[JSON](http://www.json.org/json-ja.html)、もうやってみましたか？
JSONって、ホラー映画ではないのは周知ですが、FileMakerオンリーで走って来た方にはちょっととっつきにくいのではないでしょうか？

私ですか？
私は汎用機からイマドキまで、他の言語を経験してからのFileMakerでしたので、意識的にはJSONにアレルギーはありません。
あっても今までのように克服します。（キッパリ）

# JSONとcURL

さて、JSON、JSONと言っていますが、JSONって何でしょうか。
こちら[JSON](http://www.json.org/json-ja.html)の解説が書き方として一番わかりやすいかもしれないです。
それと、JSON固有(?)の言い回しや名前などは、こちらの[JSON](http://dev.classmethod.jp/etc/concrete-example-of-json/)ページが手っ取り早く理解できそうです。

要は、XMLのような定型的なデータのやりとりをもっと簡単で人やシステムが扱いやすいような書き方にして、楽しようよ、というデータフォーマットです。（大雑把すぎ）

[XML](http://www.cybertech.co.jp/xml/contents/xmlxmldb/serial/_xmlbeginner1.php)や[EDI](http://www.planet-van.co.jp/edi/)データ構成をご存知の方は、JSONの書き方に馴染みがあるかもしれません。

しかし、JSONだけでことが成り立つわけではありません。
[cURL](http://d.hatena.ne.jp/keyword/Curl)というコトバも一緒に付いてきます。

こちらも単純に言ってしまえば、URLにパラメータくっつけてやりたいことやろうよ、という感じでしょうか（かなり大雑把）。

curlは、コマンドラインでも実行できます。
私の環境はMacですので、すでにcurlライブラリが実装されています。
サクッとやってみましょう。

↓は、コマンドラインで"curl"というコマンドにURLとパラメータをつけて郵便番号を検索ワードとして住所等を引っ張ってくる事例です。

```
catfish:~ guppy$ curl http://zipcloud.ibsnet.co.jp/api/search?zipcode=1070052
{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "港区",
			"address3": "赤坂",
			"kana1": "ﾄｳｷｮｳﾄ",
			"kana2": "ﾐﾅﾄｸ",
			"kana3": "ｱｶｻｶ",
			"prefcode": "13",
			"zipcode": "1070052"
		}
	],
	"status": 200
}catfish:~ guppy$ 
```

ここで"curl"の一行がcURLを使って検索を依頼し、JSON形式で結果が返ってくる、という事になります。

まずは、この関係がわかってないと、JSON,JSONと騒いでも理解がしづらいかと思います。

# 単純に郵便番号検索を実装してみる

## 動きの確認

では実際にFM16で試してみましょう。
ここでは単純なJSON形式を提供している[郵便番号検索API](http://zipcloud.ibsnet.co.jp/doc/api)を使って紹介します。

動画は、以下に公開しています。
[https://youtu.be/9HYa7UNbJzg](https://youtu.be/9HYa7UNbJzg)

ダイアログにあるように、URLと検索ワードを指定します。
<img width="658" alt="FM16JSON1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/58c3983d-16a0-0dfe-7c4f-6e928083d040.png">
（緑の「cURL」ボタンに実装されたスクリプトを実行しています。）


OKを押すと、URLに指定されたサイトへ検索命令を渡し、結果が返ってきます。
<img width="476" alt="FM16JSON2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/5972dc25-546a-5967-408a-e68ace66b8eb.png">

では、このレスポンスを分解してみます。
赤い「レスポンス分解」ボタンにFileMakerのJSON関連関数を使ったスクリプトが実装されています。
<img width="478" alt="FM16JSON3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/561706b4-b102-3742-94c2-212c57d1d454.png">
正常終了している場合は、messageにはnullが返ります。
status=200は、正常終了です。
resultsが実際のデータです。

resultsをそれぞれのキーに対する値に分解してみます。
青い「results分解」ボタンにFileMakerのJSON関連関数を使ったスクリプトが実装されています。
<img width="903" alt="FM16JSON4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/341b2d54-49c3-de8b-bbf0-41b0b2f1a68b.png">

## 実装してみる

では、実装をのぞいてみましょう。
テーブル構成は、以下の通りです。
<img width="616" alt="FM16JSON01.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/656707fe-b4db-6f76-2bcb-b1f3db9b8de9.png">
テストなので、全フィールドをグローバルに設定してあります。

まず最初の「cURL」ボタンです。
<img width="756" alt="FM16JSON5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/ced40097-885e-8b93-d0f2-96e57343fe18.png">
確認するために「ダイアログあり：オン」にしていますが、実運用ではオフにしておいていいと思います。

レスポンスを分解するスクリプトです。
[JSONGetElement](https://www.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fjsongetelement.html%23wwconnect_header)を使って、JSON形式の返値を分解します。
<img width="748" alt="FM16JSON6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3b001a24-2341-4b38-3a10-d53334cc4ad7.png">

さらにresultsを分解していきます。
先ほどのレスポンス分解と同じように、[JSONGetElement](https://www.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fjsongetelement.html%23wwconnect_header)を使って必要なデータを取得します。
<img width="769" alt="FM16JSON7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/67b28ec4-6a78-1bfe-9174-eba88ebd28b7.png">

単純な構造を持つJSONデータ、かつ1件のみの取得であれば、[JSONGetElement](https://www.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fjsongetelement.html%23wwconnect_header)でやりたいことが実装できます。

ここで、resultsに配列が使われているのに気がつきましたか？
1件のみの場合でも複数件でも、配列でデータを表現しています。
<img width="837" alt="FM16JSON8.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/60573613-6ba8-83f8-8ec4-704d1f8d2c7b.png">
そして、0オリジンですので、1レコード目の配列は、[0]になる事に注意です。

単純なJSONデータの操作は、JSONGetElementを覚えておく感じですね。

[次回](http://qiita.com/tyuma/items/72055b3d4184714a456a)は、複数JSONデータから各フィールドデータを取得する方法です。