Azure Data Factory にてSalesforce REST API によりシンクするコピーアクティビティを実施した際の Deserialization failed エラーへの対応方法

## 概要

Azure Data Factory （ADF）にて ADF 標準の Salesforce コネクターでなく Salesforce REST API によるコピーアクティビティを実施した際に発生する下記のような Deserialization failed エラーへの対応方法を共有します。`Create a Record`を実施する際に渡す json が配列ではなく、単一のオブジェクトとして渡す必要があります。コピーアクティビティでは配列で渡されているような動作をしているため、単一のオブジェクトとして渡すように修正する必要があります。

> [{"message":"Json Deserialization failed on token 'null' and has left off in the middle of parsing a row. Will go to end of row to begin parsing the next row","errorCode":"INVALID_FIELD"}]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/494c01a9-d21c-5ef5-8c6b-14dd3924cf04.png)

データを追加する REST API のドキュメントにて、下記のように単一のオブジェクトを渡すことが記述されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/21b917e2-9924-2eb7-c569-3ddda23d8c40.png)

引用元：[Create a Record | REST API Developer Guide | Salesforce Developers](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_create.htm)

本記事ではエラーとなったパイプライン、配列の json を渡した際に同様のエラーが発生するパイプラインにおける実行結果とその対応方法を共有します。

## エラーの再現方法

### Salesforce REST API によりシンクするパイプラインを実行

アクセストークンを取得後に REST API によるシンクのコピーアクティビティを実行すると下記のようなエラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0b4bc354-44a6-0bc5-b12a-9012a8ba7e8c.png)

> Failure happened on 'Sink' side. ErrorCode=RestCallFailedWithClientError,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Rest call failed with client error, status code 400 BadRequest, please check your activity settings.
> Request URL: https://{salesforceDomainName}.my.salesforce.com/services/data/v61.0/sobjects/Account.
> Response: [{"message":"Json Deserialization failed on token 'null' and has left off in the middle of parsing a row. Will go to end of row to begin parsing the next row","errorCode":"INVALID_FIELD"}],Source=Microsoft.DataTransfer.ClientLibrary,'

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7821ef80-207c-5385-3993-26525340f591.png)

### 配列の json を渡す web アクティビティのパイプラインを実行

下記のような配列の json を渡す web アクティビティのパイプラインを実行すると、同様のエラーが発生しました。

```json
[
	{
		"Name": "abc"
	}
]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4104d81b-970b-6396-fde9-294bda4a2683.png)


> [{"message":"Json Deserialization failed on token 'null' and has left off in the middle of parsing a row. Will go to end of row to begin parsing the next row","errorCode":"INVALID_FIELD"}]


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ba5e2245-e6cd-9ef5-3515-632148c41b3f.png)

## 対応方法

### lookup アクティビティにて取得した json の値をループにより REST API を実行

lookup アクティビティにてソースから json 形式で値を取得後、ForEach アクティビティにてその値をループ処理に単一のオブジェクトとして web アクティビティにて Salesforce REST API を実行するようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/59f922f0-d30f-98b4-8d70-6a0e8c1733f3.png)

上記のパイプラインを実行後、Salesforce にて想定通りにデータが書きこまれていることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8bd9bc01-94ad-8275-90b5-b83f2b538527.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bc110fdb-509d-d947-b17b-4018546bfce9.png)