Mule APIでは2つのjsonを結合することができる
Mule APIの最大の利点は複数のデータベースからデータを取得し、Mule上で一つのjsonにまとめ、APIのレスポンスとして返せることです。以下のように二つのデータベースからの取得結果を一つのjsonにまとめるTransform Messageコンポーネントをこの記事で紹介します。
Transform MessageコンポーネントのDataweaveを以下のように記述します。
%dw 2.0
output application/json
import every,join from dw::core::Arrays
var oracleData=
[
{
"id": "456",
"depositdate": "2023/4/1",
"clntNameKana": "鈴木太郎"
},
{
"id": "457",
"depositdate": "2023/4/2",
"clntNameKana": "佐藤太郎"
}
]
var mysqlData=
[
{
"id": "456",
"transferamount": "10000",
"accountname": "89998"
},
{
"id": "457",
"transferamount": "20000",
"accountname": "90000"
}
]
var result = join(oracleData, mysqlData, (oracleData) -> oracleData.'id', (mysqlData) -> mysqlData.'id') default []
fun transformFunction(data): Array =
{
id: data."l"."id",
depositdate: data."l"."depositdate",
transferamount: data."r"."transferamount",
accountname: data."r"."accountname",
clntNameKana: data."l"."clntNameKana"
}
---
result map ((item, index) -> transformFunction(item))
上記のDataWeave記述の説明です。
mysqlData変数にmysqlデータベースからの取得結果となるjson、oracleData変数にoracleデータベースからの取得結果となるjsonが格納されています。
Dataweaveのjoin関数を使ってoracleDataとmysqlDataをid項目で結合します。joinを使うと二つのjsonを、指定の同じ項目で内部結合することができます。join すると以下のネストされたjsonがresult変数に格納されます。
[
{
"l": {
"id": "456",
"depositdate": "2023/4/1",
"clntNameKana": "鈴木太郎"
},
"r": {
"id": "456",
"transferamount": "10000",
"accountname": "89998"
}
},
{
"l": {
"id": "457",
"depositdate": "2023/4/2",
"clntNameKana": "佐藤太郎"
},
"r": {
"id": "457",
"transferamount": "20000",
"accountname": "90000"
}
}
]
result変数はネストされたjsonになっているため、こちらをtransformFunction関数を定義し一つのjsonにします。駆動jsonとなる"l"からはidを取得し、結合されたjsonとなる"r"からはaccountnameを取得して一つのマップ(json)を定義しています。transformFunction関数にresult変数のjsonを渡すと以下のように一つのjsonが返されます。
[
{
"id": "456",
"depositdate": "2023/4/1",
"transferamount": "10000",
"accountname": "89998",
"clntNameKana": "鈴木太郎"
},
{
"id": "457",
"depositdate": "2023/4/2",
"transferamount": "20000",
"accountname": "90000",
"clntNameKana": "佐藤太郎"
}
]
簡単にDataWeaveを実行しシミュレーションしたい場合 https://dataweave.mulesoft.com/learn/dataweave
が便利です。