【PowerAutomate】2つのjson形式のデータに対して差分結果を出力する方法

# 初めに
この記事ではクラウドフローである「PowerAutomate」で2つのjson形式のデータを突合させオブジェクトごとに差分や共通している部分を出力させる方法になります。
ただし、条件として**2つのjsonで使われれているキーが一致していること**が絶対になります。
キーが少しでも違うと同士を突合することは出来ません。
必ず突合する時は、キーが一致されているように事前にjsonのデータを成形してください。
開発している中で差分や一致しているデータのみを出力させたい場合に、参考になればと思います。

# やりたいことのイメージ
やりたいことは①～③の部分をそれぞれ抽出する方イメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931886/b9b7d0a9-b197-2212-3b7d-45f2298c719b.png)

# 今回、メインとなる処理
今回は **「アレイのフィルター処理」** がメインの処理となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931886/0b2aaf18-e13f-efd3-aed6-be1b4fd0a3d6.png)

# テストデータ
今回はjson(A)とjson(B)を用意して差分結果の出力を確認してみます。
ご自身の開発環境で試したい場合はコピーしてご活用ください。
```json:json(A)
[
{
"商品コード":100,
"商品名":"リンゴ",
"個数":"1個"
},
{
"商品コード":200,
"商品名":"バナナ",
"個数":"4個"
},
{
"商品コード":300,
"商品名":"ぶどう",
"個数":"3個"
},
{
"商品コード":400,
"商品名":"モモ",
"個数":"7個"
},
{
"商品コード":500,
"商品名":"ミカン",
"個数":"15個"
}
]
```

```json:json(B)
[
{
"商品コード":300,
"商品名":"ぶどう",
"個数":"3個"
},
{
"商品コード":400,
"商品名":"モモ",
"個数":"7個"
},
{
"商品コード":500,
"商品名":"ミカン",
"個数":"15個"
},
{
"商品コード":600,
"商品名":"梨",
"個数":"5個"
},
{
"商品コード":700,
"商品名":"スイカ",
"個数":"1個"
}
]
```

# テストフロー
今回のテストフローはこんな感じ。(超シンプルです)
フロー作成のやり方は...
1.「手動でフロートリガーします」を選択しフローを新規作成。
2. 組み込み＞データ操作＞作成を選択。json(A)とjson(B)をそれぞれ入力します。
3. 2つのjsonデータを用意することができたら、組み込み＞データ操作＞アレイのフィルター処理を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931886/f44781ee-0cd9-f5ad-72a7-bc7c79e1fdab.png)

「アレイのフィルター処理」の詳細モードはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931886/37bb85b5-7652-506c-42df-f5dd69edc9cb.png)

次のセクションから、アレイのフィルター処理に式を入力し結果が変化することを確認していきましょう。
# 処理結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931886/b9b7d0a9-b197-2212-3b7d-45f2298c719b.png)

### ①と③の結果出力
①の部分（json(A)だけにある情報）を抜き出したい場合は...
　・差出人を「**outputs('json(A)')**」
　・条件の左側に「**contains(outputs('json(B)'), item())**」
　・条件の真ん中は「**次の値に等しくない**」
　・条件の右側は「**true**」
と入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931886/f50023eb-fac9-18f4-7327-b51424a58443.png)
結果は以下のようになると思います。
```json:①の結果
[
  {
    "商品コード": 100,
    "商品名": "リンゴ",
    "個数": "1個"
  },
  {
    "商品コード": 200,
    "商品名": "バナナ",
    "個数": "4個"
  }
]
```
③の部分を求めたい場合はjson(A)とjson(B)の記述を逆にすればよいです。
　・差出人を「**outputs('json(B)')**」
　・条件の左側に「**contains(outputs('json(A)'), item())**」
　・条件の真ん中は「**次の値に等しくない**」
　・条件の右側は「**true**」

 結果は以下の通り。
 ```json:③の結果
[
  {
    "商品コード": 600,
    "商品名": "梨",
    "個数": "5個"
  },
  {
    "商品コード": 700,
    "商品名": "スイカ",
    "個数": "1個"
  }
]
```

### ②の結果出力
json(A)とjson(B)の共通部分を求める場合は条件の真ん中を「次の値に等しい」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931886/88f8c160-4c12-b6ab-914f-061b43611494.png)
結果は以下の通りです。
 ```json:②の結果
[
  {
    "商品コード": 300,
    "商品名": "ぶどう",
    "個数": "3個"
  },
  {
    "商品コード": 400,
    "商品名": "モモ",
    "個数": "7個"
  },
  {
    "商品コード": 500,
    "商品名": "ミカン",
    "個数": "15個"
  }
]
```
# contains関数についてちょっと解説
今回使ったcontains関数（contains(A,B)）ですが、これはAの中にBが含まれていればtureを返します。含まれていない場合はfalseを返す関数となっています。

アレイのフィルター処理でjsonを使うと差出人に指定したjsonの｛｝を含めたオブジェクトごとを1ずつ突合してくれます。
よって、差出人に記載している{}の数だけ毎回突合をしてもらい、それぞれに対してtureとfalseを返してくれます。
（冒頭で記載した「条件として**2つのjsonで使われれているキーが一致していること**」はこれが理由になります。）
詳しくはMicrosoftのドキュメントをご確認ください。

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#contains

# 最後に
長々と説明しましたが、実際に動かしてみた方が理解しやすいと思いますので、今回用意したテストデータとフローを作成し実際に確認してみてください。
理解した後、活用したい箇所にフロー追加をしてください。