Azure Data Factory 和 Azure Synapse Analytics 中的 JSON 格式

適用於: Azure Data Factory Azure Synapse Analytics

提示

試用 Microsoft Fabric 中的 Data Factory,這是適用於企業的單一分析解決方案。 Microsoft Fabric 涵蓋從數據移動到數據科學、即時分析、商業智慧和報告等所有專案。 瞭解如何 免費啟動新的試用版

當您想要 剖析 JSON 檔案或將數據寫入 JSON 格式時,請遵循這篇文章。

下列連接器支援 JSON 格式:

資料集屬性

如需可用來定義資料集之區段和屬性的完整清單,請參閱 數據集 一文。 本節提供 JSON 數據集所支援的屬性清單。

屬性 描述 必要
type 數據集的 type 屬性必須設定為 Json Yes
location 檔案的位置設定。 每個檔案型連接器都有自己的位置類型和支持的屬性。location 請參閱連接器文章 -> 資料集屬性一節中的詳細數據。 Yes
encodingName 用來讀取/寫入測試檔案的編碼類型。
允許的值如下:“UTF-8”、“UTF-8 不含 BOM”、“UTF-16”、“UTF-16BE”、“UTF-32”、“UTF-32BE”、“US-ASCII”、“UTF-7”、 “BIG5”、“EUC-JP”、“EUC-KR”、“GB2312”、“GB18030”、“JOHAB”、“SHIFT-JIS”、“CP875”、“CP866”、“CP866”、“IBM00858”、“IBM037”、“IBM273”、“IBM437”、“IBM500”、“IBM737”、 “IBM775”、“IBM850”、“IBM852”、“IBM855”、“IBM857”、“IBM860”、“IBM861”、“IBM863”、“IBM864”、“IBM865”、“IBM865”、“ IBM869”、“IBM870”、“IBM01140”、“IBM01141”、“IBM01142”、“IBM01143”、“IBM01144”、“IBM01145”、“IBM01146”、“IBM01147”、 “IBM01148”、“IBM01149”、“ISO-2022-JP”、“ISO-2022-KR”、“ISO-8859-1”、 “ISO-8859-2”、“ISO-8859-3”、“ISO-8859-4”、“ISO-8859-5”、“ISO-8859-6”、“ISO-8859-7”、“ISO-8859-8”、“ISO-8859-9”、 “ISO-8859-13”、“ISO-8859-15”、“WINDOWS-874”、“WINDOWS-1250”、“WINDOWS-1251”、“WINDOWS-12552”、“WINDOWS-1253”、“WINDOWS-1254”、“WINDOWS-1255”、“WINDOWS-1256”、“WINDOWS-1257”、“WINDOWS-1258”。
No
壓縮 要配置檔案壓縮的屬性群組。 當您想要在活動執行期間執行壓縮/解壓縮時,請設定本節。 No
type
compression
用來讀取/寫入 JSON 檔案的壓縮編解碼器。
允許的值為 bzip2gzip、deflateZipDeflateTarGzipTarsnappylz4。 默認值不會壓縮。
請注意,目前 複製活動 不支援 「snappy」 和 「lz4」,而對應數據流不支援 「ZipDeflate」、“TarGzip” 和 “Tar”。
請注意,使用複製活動將 ZipDeflate/TarGzip/Tar 檔案解壓縮並寫入檔案型接收數據存放區時,預設會擷取至 folder:<path specified in dataset>/<folder named as source compressed file>/,使用preserveCompressionFileNameAsFolderpreserveZipFileNameAsFolder/複製活動來源來控制是否保留壓縮檔的名稱作為資料夾結構。
否。
level
compression
壓縮比例。
允許的值為 最佳最快值。
- 最快: 即使產生的檔案未以最佳方式壓縮,壓縮作業也應該儘快完成。
- 最佳:即使作業需要較長的時間才能完成,壓縮作業也應該以最佳方式壓縮。 如需詳細資訊,請參閱 壓縮層級 主題。
No

以下是 Azure Blob 儲存體 上的 JSON 數據集範例:

{
    "name": "JSONDataset",
    "properties": {
        "type": "Json",
        "linkedServiceName": {
            "referenceName": "<Azure Blob Storage linked service name>",
            "type": "LinkedServiceReference"
        },
        "schema": [ < physical schema, optional, retrievable during authoring > ],
        "typeProperties": {
            "location": {
                "type": "AzureBlobStorageLocation",
                "container": "containername",
                "folderPath": "folder/subfolder",
            },
            "compression": {
                "type": "gzip"
            }
        }
    }
}

複製活動 屬性

如需可用來定義活動的區段和屬性的完整清單,請參閱 管線 一文。 本節提供 JSON 來源和接收所支援的屬性清單。

瞭解如何從 JSON 檔案擷取數據,並對應至接收數據存放區/格式,反之亦然從 架構對應

JSON 作為來源

複製活動 *source* 區段中支援下列屬性。

屬性 描述 必要
type 複製活動來源的 type 屬性必須設定為 JSONSource Yes
format 設定 屬性群組。 請參閱下面的 JSON 讀取設定表。 No
store 設定 如何從數據存放區讀取數據的一組屬性。 每個檔案型連接器在 下 storeSettings都有自己的支援讀取設定。 請參閱連接器文章 -> 複製活動 屬性一節中的詳細數據。 No

支援的 JSON 讀取設定formatSettings

屬性 描述 必要
type 格式的類型 設定 必須設定為 JsonRead 設定 Yes
compressionProperties 如何解壓縮指定壓縮編解碼器之數據的屬性群組。 No
preserveZipFileNameAsFolder
compressionProperties->type as ZipDeflateReadSettings
當輸入數據集設定為 ZipDeflate 壓縮時適用。 指出是否要在複製期間保留來源 zip 檔名作為資料夾結構。
- 當設定為 true (預設值)時,服務會將解壓縮的檔案寫入至 <path specified in dataset>/<folder named as source zip file>/
- 當設定為 false 時,服務會將解壓縮的檔案直接寫入 。<path specified in dataset> 請確定您在不同的來源 zip 檔案中沒有重複的檔名,以避免發生賽車或非預期的行為。
No
preserveCompressionFileNameAsFolder
compressionProperties->type as TarGZipReadSettingsTarReadSettings
當輸入數據集設定為 TarGzip/Tar 壓縮時適用。 指出是否要在複製期間保留來源壓縮檔名做為資料夾結構。
- 當設定為 true(預設值)時,服務會將解壓縮的檔案寫入至 <path specified in dataset>/<folder named as source compressed file>/
- 當設定為 false 時,服務會將解壓縮的檔案直接寫入 。<path specified in dataset> 請確定您在不同的原始程式檔中沒有重複的檔名,以避免發生賽車或非預期的行為。
No

JSON 作為接收

複製活動 *sink* 區段中支援下列屬性。

屬性 描述 必要
type 複製活動來源的 type 屬性必須設定為 JSONSink Yes
format 設定 屬性群組。 請參閱下面的 JSON 寫入設定表。 No
store 設定 如何將數據寫入數據存放區的屬性群組。 每個檔案型連接器在下 storeSettings都有自己的支援寫入設定。 請參閱連接器文章 -> 複製活動 屬性一節中的詳細數據。 No

支援的 JSON 寫入設定formatSettings

屬性 描述 必要
type 格式的類型 設定 必須設定為 JsonWrite 設定 Yes
filePattern 指出儲存在每個 JSON 檔案中的數據模式。 允許的值為: setOfObjects (JSON Lines) 和 arrayOfObjects默認值setOfObjects。 如需這些模式的詳細資訊,請參閱 JSON 檔案模式一節。 No

JSON 檔案模式

從 JSON 檔案複製資料時,複製活動可以自動偵測並剖析下列 JSON 檔案模式。 將數據寫入 JSON 檔案時,您可以在複製活動接收上設定檔案模式。

  • 類型 I:setOfObjects

    每個檔案都包含單一物件、JSON 行或串連物件。

    • 單一物件 JSON 範例

      {
          "time": "2015-04-29T07:12:20.9100000Z",
          "callingimsi": "466920403025604",
          "callingnum1": "678948008",
          "callingnum2": "567834760",
          "switch1": "China",
          "switch2": "Germany"
      }
      
    • JSON 線條 (接收的預設值)

      {"time":"2015-04-29T07:12:20.9100000Z","callingimsi":"466920403025604","callingnum1":"678948008","callingnum2":"567834760","switch1":"China","switch2":"Germany"}
      {"time":"2015-04-29T07:13:21.0220000Z","callingimsi":"466922202613463","callingnum1":"123436380","callingnum2":"789037573","switch1":"US","switch2":"UK"}
      {"time":"2015-04-29T07:13:21.4370000Z","callingimsi":"466923101048691","callingnum1":"678901578","callingnum2":"345626404","switch1":"Germany","switch2":"UK"}
      
    • 串連 JSON 範例

      {
          "time": "2015-04-29T07:12:20.9100000Z",
          "callingimsi": "466920403025604",
          "callingnum1": "678948008",
          "callingnum2": "567834760",
          "switch1": "China",
          "switch2": "Germany"
      }
      {
          "time": "2015-04-29T07:13:21.0220000Z",
          "callingimsi": "466922202613463",
          "callingnum1": "123436380",
          "callingnum2": "789037573",
          "switch1": "US",
          "switch2": "UK"
      }
      {
          "time": "2015-04-29T07:13:21.4370000Z",
          "callingimsi": "466923101048691",
          "callingnum1": "678901578",
          "callingnum2": "345626404",
          "switch1": "Germany",
          "switch2": "UK"
      }
      
  • 類型 II:arrayOfObjects

    每個檔案都包含 對象的陣列。

    [
        {
            "time": "2015-04-29T07:12:20.9100000Z",
            "callingimsi": "466920403025604",
            "callingnum1": "678948008",
            "callingnum2": "567834760",
            "switch1": "China",
            "switch2": "Germany"
        },
        {
            "time": "2015-04-29T07:13:21.0220000Z",
            "callingimsi": "466922202613463",
            "callingnum1": "123436380",
            "callingnum2": "789037573",
            "switch1": "US",
            "switch2": "UK"
        },
        {
            "time": "2015-04-29T07:13:21.4370000Z",
            "callingimsi": "466923101048691",
            "callingnum1": "678901578",
            "callingnum2": "345626404",
            "switch1": "Germany",
            "switch2": "UK"
        }
    ]
    

對應數據流屬性

對應數據流中,您可以在下列數據存放區中讀取和寫入 JSON 格式:Azure Blob 儲存體、Azure Data Lake 儲存體 Gen1Azure Data Lake 儲存體 Gen2SFTP,而且您可以在 Amazon S3讀取 JSON 格式。

來源屬性

下表列出 json 來源所支持的屬性。 您可以在 [ 來源選項 ] 索引標籤編輯這些屬性。

名稱 描述 必要 允許的值 數據流腳本屬性
通配符路徑 將會處理符合通配符路徑的所有檔案。 覆寫數據集中設定的資料夾和檔案路徑。 String[] 通配符路徑
數據分割根路徑 針對分割的檔案數據,您可以輸入資料分割根路徑,以將數據分割資料夾讀取為數據行 String partitionRootPath
檔案清單 您的來源是否指向列出要處理的檔案的文字檔 truefalse fileList
要儲存檔名的數據行 使用來源檔名和路徑建立新的數據行 String rowUrlColumn
完成之後 在處理之後刪除或移動檔案。 檔案路徑從容器根目錄開始 刪除: truefalse
移動: ['<from>', '<to>']
purgeFiles
moveFiles
依上次修改日期來篩選 選擇根據上次更改檔案的時間篩選檔案 時間戳記 modifiedAfter
modifiedBefore
單一檔 對應數據流會從每個檔案讀取一個 JSON 檔 truefalse singleDocument
未加上批註的數據行名稱 如果 選取 [未批注的數據行名稱 ],對應數據流會讀取未以引號括住的 JSON 數據行。 truefalse unquotedColumnNames
具有批注 如果 JSON 數據具有 C 或 C++ 樣式批注,請選取 [有批注 ] truefalse asComments
單引號 讀取未以引弧括住的 JSON 數據行 truefalse singleQuoted
反斜杠逸出 如果使用反斜杠來逸出 JSON 數據中的字元,請選取 [反斜 杠逸出] truefalse backslashEscape
允許找不到任何檔案 如果為 true,則找不到任何檔案時不會擲回錯誤 truefalse ignoreNoFilesFound

內嵌數據集

對應數據流支援「內嵌數據集」作為定義來源和接收的選項。 內嵌 JSON 資料集會直接定義在您的來源和接收轉換內,且不會在定義的數據流外部共用。 它適用於直接在數據流內參數化數據集屬性,並可受益於透過共用ADF數據集改善的效能。

當您讀取大量來源資料夾和檔案時,您可以藉由在投影內設定 [使用者投影架構] 選項來改善數據流檔案探索的效能 |[架構選項] 對話框。 此選項會關閉ADF的預設架構自動探索,並大幅改善檔案探索的效能。 設定此選項之前,請務必匯入 JSON 投影,讓 ADF 具有現有的投影架構。 此選項不適用於架構漂移。

來源格式選項

使用 JSON 資料集作為數據流中的來源,可讓您設定五個額外的設定。 您可以在 [來源選項] 索引標籤的 [JSON 設定] 雅閣下找到這些設定。針對 [文件表單體] 設定,您可以選取 [單一檔]、[每行] 和 [文件陣列] 類型的其中一個。

JSON Settings

預設

根據預設,JSON 數據會以下列格式讀取。

{ "json": "record 1" }
{ "json": "record 2" }
{ "json": "record 3" }

單一檔

如果 選取 [單一檔 ],對應數據流會從每個檔案讀取一個 JSON 檔。

File1.json
{
    "json": "record 1"
}
File2.json
{
    "json": "record 2"
}
File3.json
{
    "json": "record 3"
}

如果 選取 [每行 檔],對應數據流會從檔案中的每個行讀取一個 JSON 檔。

File1.json
{"json": "record 1"}

File2.json
 {"time":"2015-04-29T07:12:20.9100000Z","callingimsi":"466920403025604","callingnum1":"678948008","callingnum2":"567834760","switch1":"China","switch2":"Germany"}
 {"time":"2015-04-29T07:13:21.0220000Z","callingimsi":"466922202613463","callingnum1":"123436380","callingnum2":"789037573","switch1":"US","switch2":"UK"}

File3.json
 {"time":"2015-04-29T07:12:20.9100000Z","callingimsi":"466920403025604","callingnum1":"678948008","callingnum2":"567834760","switch1":"China","switch2":"Germany"}
 {"time":"2015-04-29T07:13:21.0220000Z","callingimsi":"466922202613463","callingnum1":"123436380","callingnum2":"789037573","switch1":"US","switch2":"UK"}
 {"time":"2015-04-29T07:13:21.4370000Z","callingimsi":"466923101048691","callingnum1":"678901578","callingnum2":"345626404","switch1":"Germany","switch2":"UK"}

如果 選取檔 陣列,對應資料流會從檔案讀取一個檔陣列。

File.json
[
        {
            "time": "2015-04-29T07:12:20.9100000Z",
            "callingimsi": "466920403025604",
            "callingnum1": "678948008",
            "callingnum2": "567834760",
            "switch1": "China",
            "switch2": "Germany"
        },
        {
            "time": "2015-04-29T07:13:21.0220000Z",
            "callingimsi": "466922202613463",
            "callingnum1": "123436380",
            "callingnum2": "789037573",
            "switch1": "US",
            "switch2": "UK"
        },
        {
            "time": "2015-04-29T07:13:21.4370000Z",
            "callingimsi": "466923101048691",
            "callingnum1": "678901578",
            "callingnum2": "345626404",
            "switch1": "Germany",
            "switch2": "UK"
        }
    ]

注意

如果數據流在預覽 JSON 數據時擲回錯誤,指出「corrupt_record」,您的數據很可能在 JSON 檔案中包含單一檔。 設定「單一檔」應該清除該錯誤。

未加上批註的數據行名稱

如果 選取 [未批注的數據行名稱 ],對應數據流會讀取未以引號括住的 JSON 數據行。

{ json: "record 1" }
{ json: "record 2" }
{ json: "record 3" }

具有批注

如果 JSON 數據具有 C 或 C++ 樣式批注,請選取 [有批注 ]。

{ "json": /** comment **/ "record 1" }
{ "json": "record 2" }
{ /** comment **/ "json": "record 3" }

單引號

如果 JSON 欄位和值使用單引號,而不是雙引號,請選取 [單 引號]。

{ 'json': 'record 1' }
{ 'json': 'record 2' }
{ 'json': 'record 3' }

反斜杠逸出

如果使用反斜杠來逸出 JSON 數據中的字元,請選取 [反斜 杠逸出]。

{ "json": "record 1" }
{ "json": "\} \" \' \\ \n \\n record 2" }
{ "json": "record 3" }

接收屬性

下表列出 json 接收所支持的屬性。 您可以在 [設定] 索引標籤編輯這些屬性。

名稱 描述 必要 允許的值 數據流腳本屬性
清除資料夾 如果在寫入之前清除目的地資料夾 truefalse truncate
檔名選項 寫入數據的命名格式。 根據預設,每個分割區一個檔案的格式為 part-#####-tid-<guid> 模式:字串
每個分割區:String[]
當做數據行中的數據:字串
輸出至單一檔案: ['<fileName>']
filePattern
partitionFileNames
rowUrlColumn
partitionFileNames

在衍生數據行中建立 JSON 結構

您可以透過衍生的數據行表達式產生器,將複雜數據行新增至數據流。 在衍生的數據行轉換中,新增數據行,然後按兩下藍色方塊來開啟表示式產生器。 若要使數據行變得複雜,您可以手動輸入 JSON 結構,或使用 UX 以互動方式新增子數據行。

使用表達式產生器 UX

在輸出架構側邊窗格中,將滑鼠停留在數據行上,然後按下加號圖示。 選取 [新增子欄 ],使數據行成為複雜類型。

Add subcolumn

您可以以相同方式新增其他資料行和子數據行。 對於每個非複雜欄位,表達式可以在右側的表達式編輯器中新增。

Add complex column

手動輸入 JSON 結構

若要手動新增 JSON 結構,請新增數據行,然後在編輯器中輸入表達式。 運算式遵循下列一般格式:

@(
    field1=0,
    field2=@(
        field1=0
    )
)

如果為名為 「complexColumn」 的資料行輸入此運算式,則會以下列 JSON 形式寫入接收:

{
    "complexColumn": {
        "field1": 0,
        "field2": {
            "field1": 0
        }
    }
}

完整階層式定義的範例手動腳本

@(
    title=Title,
    firstName=FirstName,
    middleName=MiddleName,
    lastName=LastName,
    suffix=Suffix,
    contactDetails=@(
        email=EmailAddress,
        phone=Phone
    ),
    address=@(
        line1=AddressLine1,
        line2=AddressLine2,
        city=City,
        state=StateProvince,
        country=CountryRegion,
        postCode=PostalCode
    ),
    ids=[
        toString(CustomerID), toString(AddressID), rowguid
    ]
)

以下是一些與 JSON 格式相關的常見連接器和格式:

  • Azure Blob 儲存體(connector-azure-blob-storage.md)
  • 分隔文字格式(format-delimited-text.md)
  • OData 連接器(connector-odata.md)
  • Parquet 格式(format-parquet.md)