

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從 JSON 格式 COPY
<a name="copy-usage_notes-copy-from-json"></a>

JSON 資料結構由一組物件或陣列組成。JSON *物件*的開頭和結尾是大括號，且包含一組未排序的名稱值對。每一個名稱和值以冒號分隔，而配對以逗號分隔。名稱是以雙引號括住的字串。引號字元必須是簡單引號 (0x22)，而不是斜向或「智慧型」引號。

JSON *陣列* 的開頭和結尾是方括號，且包含一組已排序的值 (以逗號分隔)。值可以是以雙引號括住的字串、數字、布林值 true 或 false、null、JSON 物件或陣列。

JSON 物件和陣列可以是巢狀，以支援階層資料結構。下列範例顯示具有兩個有效物件的 JSON 資料結構。

```
{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}
```

下面以兩個 JSON 陣列顯示同樣的資料。

```
[
    1006410,
    "Amazon Redshift Database Developer Guide"
]
[
    100540,
    "Amazon Simple Storage Service User Guide"
]
```

## 適用於 JSON 的 COPY 選項
<a name="copy-usage-json-options"></a>

將 COPY 與 JSON 格式資料搭配使用時，可以指定下列選項：
+ `'auto' ` - COPY 會自動從 JSON 檔案載入欄位。
+ `'auto ignorecase'` - COPY 會自動從 JSON 檔案載入欄位，同時忽略欄位名稱的大小寫。
+ `s3://jsonpaths_file` - COPY 會使用 JSONPaths 檔案來剖析 JSON 來源資料。*JSONPaths 檔案*是包含單一 JSON 物件的文字檔案，此物件的名稱為 `"jsonpaths"`，並與 JSONPath 表達式陣列搭配成對。如果名稱是 `"jsonpaths"` 以外的任何字串，COPY 會使用 `'auto'` 引數，而不使用 JSONPaths 檔案。

關於如何使用 `'auto'`、`'auto ignorecase'` 或 JSONPaths 檔案及使用 JSON 物件或陣列來載入資料的範例，請參閱[從 JSON 複製的範例](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json)。

## JSONPath 選項
<a name="copy-usage-json-options"></a>

在 Amazon Redshift COPY 語法中，JSONPath 運算式會使用括號或點符號，指定 JSON 階層式資料結構中單一名稱元素的明確路徑。Amazon Redshift 不支援任何可能解析為不明確路徑或多個名稱元素的 JSONPath 元素，例如萬用字元或篩選條件運算式。因此，Amazon Redshift 無法剖析複雜、多層級的資料結構。

以下是 JSONPaths 檔案的範例，其中的 JSONPath 表達式使用方括號標記法。貨幣符號 ($) 代表根層級結構。

```
{
    "jsonpaths": [
       "$['id']",
       "$['store']['book']['title']",
	"$['location'][0]" 
    ]
}
```

 在上述範例中，`$['location'][0]` 參考陣列的第一個元素。JSON 採用以零為基礎的陣列索引。陣列索引必須是正整數 (大於或等於零)。

下列範例使用點標記法來示範前一個 JSONPaths 檔案。

```
{
    "jsonpaths": [
       "$.id",
       "$.store.book.title",
	"$.location[0]"
    ]
}
```

`jsonpaths` 陣列中不能混用方括號標記法和點標記法。方括號標記法和點標記法中都可以使用方括號來參考陣列元素。

使用點標記法時，JSONPath 運算式不可包含下列字元：
+ 一般單引號 ( ' ) 
+ 句點，或點 ( . ) 
+ 方括號 ( [ ] )，除非用來參考陣列元素 

如果 JSONPath 運算式所參考的名稱值對中的值是物件或陣列，則會將整個物件或陣列載入為字串，包括大括號或方括號。例如，假設 JSON 資料包含下列物件。

```
{
    "id": 0,
    "guid": "84512477-fa49-456b-b407-581d0d851c3c",
    "isActive": true,
    "tags": [
        "nisi",
        "culpa",
        "ad",
        "amet",
        "voluptate",
        "reprehenderit",
        "veniam"
    ],
    "friends": [
        {
            "id": 0,
            "name": "Martha Rivera"
        },
        {
            "id": 1,
            "name": "Renaldo"
        }
    ]
}
```

JSONPath 表達式 `$['tags']` 會傳回下列值。

```
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]" 
```

JSONPath 表達式 `$['friends'][1]` 會傳回下列值。

```
"{"id": 1,"name": "Renaldo"}" 
```

`jsonpaths` 陣列中的每個 JSONPath 運算式都對應至 Amazon Redshift 目標資料表中的一欄。`jsonpaths` 陣列元素的順序必須符合目標資料表或欄清單 (如果使用欄清單) 中的欄順序。

關於如何使用 `'auto'` 引數或 JSONPaths 檔案及使用 JSON 物件或陣列來載入資料的範例，請參閱[從 JSON 複製的範例](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json)。

如需如何複製多個 JSON 檔案的相關資訊，請參閱[使用資訊清單指定資料檔案](loading-data-files-using-manifest.md)。

## JSON 中的逸出字元
<a name="copy-usage-json-escape-characters"></a>

COPY 會載入 `\n` 做為新行字元，也會載入 `\t` 做為 Tab 字元。若要載入反斜線，請加上反斜線 ( `\\` ) 來逸出。

例如，假設您在 `escape.json` 儲存貯體的一個名為 `s3://amzn-s3-demo-bucket/json/` 檔案中有下列 JSON。

```
{
  "backslash": "This is a backslash: \\",
  "newline": "This sentence\n is on two lines.",
  "tab": "This sentence \t contains a tab."
}
```

執行下列命令來建立 ESCAPES 資料表並載入 JSON。

```
create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35));

copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as json 'auto';
```

查詢 ESCAPES 資料表來檢視結果。

```
select * from escapes;

       backslash        |      newline      |               tab
------------------------+-------------------+----------------------------------
 This is a backslash: \ | This sentence     | This sentence    contains a tab.
                        :  is on two lines.
(1 row)
```

## 遺失數值精確度
<a name="copy-usage-json-rounding"></a>

從 JSON 格式的資料檔案中將數字載入已定義為數值資料類型的欄時，可能會遺失精確度。電腦系統中無法精確表示某些浮點值。因此，從 JSON 檔案複製的資料可能不會如預期般四捨五入。為了避免遺失精確度，建議您使用下列其中一個替代方法：
+ 以字串來表示數字，用雙引號括住值。
+ 使用 [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 將數字四捨五入而非截斷。
+ 使用 CSV、字元分隔或固定寬度的文字檔案，而不要使用 JSON 或 Avro 檔案。