Talendコンポーネント活用（４）階層化Jsonファイルを出力する

#**階層化JSONファイルの出力処理**#
前回は階層化したJSONファイルの入力処理を紹介しましたが、今回は前回で出力したCSVを読み込んで階層化JSONファイルを作成しする処理を紹介します。

#**標準コンポーネントでは？**#
処理を作成する過程で標準コンポーネントで試行錯誤してみたのですが、なかなか手ごわい状況になってしまったので今回はカスタムコンポーネントを使用することにしました。
カスタムコンポーネントを使用する方法は[こちら](https://qiita.com/shimiyou10/items/d0965fda7630c7bd0a01)を参考にしてください。

#**カスタムコンポーネント tJSONDocOutput**#
tJSONDocOutputはJSONの階層を何層にも出力することができたり、より複雑なJSONファイルを作成することができます。
tJSONDocOutputの特性として親子連携があり、１つ目のtJSONDocOutputで１階層目を作成して、２つ目のtJSONDocOutputで２階層目を作成するということが可能になっています。
今回はあくまで２階層化のJSONファイル出力の実現に重点を置きましたので、ターゲットのファイルを２段階に読み込んで処理する形にしました。

#**入力ファイル**#
前回の階層化JSONファイル入力処理で出力したCSVファイルからデータを読み込みます。
![Input_Sample_Extra_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/5c010c22-11e9-647b-12be-a9fbba547444.jpeg)

#**tJSONDocOpenの設定**#
tJSONDocOutputを使用する前に、tJSONDocOpenでジョブ内部で使用するJSONオブジェクトを定義します。
今回はジョブ内で新たに作成しますので"New Empty Object"を選択します。
![Output_Sample_Extra_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/4649352b-b7c7-499c-ff8f-4057aeab1060.jpeg)

#**１階層目の作成**#
まずtFileInputDelomitedを配置してCSVファイルを読み込みます。
この時に最初に配置したtJSONDocOpenからOnSubjobOKで接続します。
![Output_Sample_Extra_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/e1648124-0184-2ee0-209a-10d1bb027f38.jpeg)

１階層目はtypeとnameになりますので、この２項目をグループ化するためにtAggregateRowを配置します。
![Output_Sample_Extra_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/8ce429a1-12bf-ead9-e711-675658cb74ba.jpeg)

tAggegateRowの設定
![Output_Sample_Extra_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/83bbbbe6-a01e-0885-ae89-f86851d4c75d.jpeg)

１階層目のtypeとnameの値を２階層目の読み込み時のフィルター用に保存するためにtSetGlobalVarを配置します。
![Output_Sample_Extra_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/bbd2ab7e-de32-94fb-3c88-69531051f4cf.jpeg)

tSetGlobalVarの設定
![Output_Sample_Extra_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/3cf52778-556d-3a0b-4f05-4903d8d92a91.jpeg)

１階層目のJSONデータを作成するためにtJSONDocOutputを配置します。
![Output_Sample_Extra_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/661e2f70-9a7a-3ff5-958d-a4417c60ca9f.jpeg)

１階層目tJSONDocOutputの設定
Parent JSON Documentは最初に配置した"tJSONDocOpen_1"を設定します。
JSON path for the parentにはルート直下に記述する"SalesData"を設定します。
Attributes内のUser columnには出力する２項目にチェックを設定します。
他の設定項目は全て初期値です。
![Output_Sample_Extra_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/1efaba75-a5da-6f32-f4a9-92db2434c460.jpeg)

ここまでの設定で１階層目のJSONファイルを作成する段階までできました。

#**２階層目の作成**#
２階層目の読み込むを行うtFileInputDelimitedを配置して、tJSONDocOutputからIterateで接続します。
![Output_Sample_Extra_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/bc172d83-85c4-c1a8-ada6-8ca4dfd89ff4.jpeg)

２階層目に出力するデータを１階層目のデータと一致させるためにtFilterRowを配置します。
![Output_Sample_Extra_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/1f921d99-d2bc-caf1-cf69-b2d7c262bc7d.jpeg)

tFilterRowの設定
１階層目で保存したglobalMapの値と比較するように設定します。
![Output_Sample_Extra_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/990a7a3e-49fc-3df4-1cdc-9f7fa594e5b9.jpeg)

２階層目のJSONデータを作成するためにtJSONDocOutputを配置します。
![Output_Sample_Extra_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/a4d631a0-ff9f-18cc-eeaa-6ffdcfaca14b.jpeg)

２階層目tJSONDocOutputの設定
Parent JSON Documentは１階層目に配置した"tJSONDocOutput_1"を設定します。
JSON path for the parentには２階層目に記述する"details"を設定します。
Attributes内のUser columnでは２階層目に出力する３項目（Store、Date、Num）にチェックを設定します。
他の設定項目は全て初期値です。
![Output_Sample_Extra_13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/e1251a91-b40a-9586-db75-f5407e06e21b.jpeg)

最後に作成したJSONをファイルに出力するためにtJSONDocSaveを配置して、１階層目から２階層目をを作成したサブジョブからOnSubjobOkで接続します。
![Output_Sample_Extra_14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/32a29689-12c5-0ba6-d338-d576b73dd169.jpeg)

tJSONDocSaveの設定
JSON Document rootには最初に配置した"tJSONDocOpen_1"を設定します。
Write output as fileにチェックし、Outputfile pathに出力するファイル名をフルパスで設定します。
スキーマはInputと同じスキーマを設定し、Output schema columnはtypeに設定します。
他の設定項目は全て初期値です。
コンポーネントに警告が表示されていますが動作上は問題ありません。
![Output_Sample_Extra_15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/eec2d994-be02-b87d-7e6a-56d160ea2710.jpeg)
以上でジョブの設定は完了です。

#**実行後の出力結果**
![Output_Sample_Extra_16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/2c88c8dd-bdb9-a3d6-2862-c5cbc81e1598.jpeg)
出力されたJSONファイルは前回で読み込んだ内容と一致しました。
標準コンポーネントを使用してJSONファイルを出力した時は成型されずにデータの項目位置もばらばらになっていましたが、今回は綺麗に成型されて項目の出力順も全てジョブの設定と同じに出力できました。

#**まとめ**
多少の慣れが必要になるとは思いますが、tJSONDoc関連のコンポーネントを利用することにより多種多様なJSONファイルの入出力が可能になることがわかりました。
今後は他のパターンにも挑戦したいと思います。