常見的JSON實務範例,裡面包含的物件是層層疊疊的,物件裡有清單、清單裡有物件,對應到Power Query編輯器的M語言,熟識List、Record、Table等容器後,會有更清楚的脈絡與思維,在資料轉換的操作上更有莫大的幫助。
原本在資料表的設計上,如果欄位裡的內容允許填入多項資料,而非只是基元值(Atomic Value),則該欄位的資料型態若是設定為List容器,將是不錯的選擇。這篇文章的實作範例是檔案名稱為[分店清單(多家分店).json]的JSON檔案,您可以事先下載。此檔案是在一個資料表裡儲存各分店資料,包含[分店]名稱、[店長]姓名、店長[個資]與分店[成員]等資料行,其中[分店]名稱及[店長]姓名設定為文字型態是頗為適宜的,而店長[個資]是以記錄(Record)型態呈現,儲存著[性別]、[年齡]、[血型]及[學歷]等相關欄位;至於分店[成員]則在此是規劃為List(清單)資料型態,可以讓每一家分店存放著為數不一的成員資料,而每一位成員資料可以是一筆記錄(Record)型態,儲存著該成員的[工號]、[姓名]、[專長]等相關欄位,其中[工號]、[姓名]亦是文字型態的內容,而員工[專長]則是定義為List(清單)資料型態,因為每一位員工可以登錄不只一項專長。您會發覺,清單裡有物件、物件裡有清單;清單裡有記錄、記錄裡又可包含清單,這般的範例屢見不鮮。以下我們就來解析與實作一下這個複雜但不難懂的實務範例吧!(請事先下載詞作檔案)
開啟Excel在空白活頁簿的環境下點按[資料]索引標籤裡[取得資料]命令按鈕,從展開的下拉式功能選單中點選[從檔案]功能選項,並在從副選單中點選[從JSON]功能選項。
開啟[匯入資料]對話,選擇本文所列舉的範例[分店清單v2(多家分店).JSON]檔案。
立即進入Power Query查詢編輯器來解析並轉換這份JSON檔案。此範例結果是屬於Power Query M語言的清單容器,裡面記載了兩個Record容器。請在此透過清單轉換成資料表的操作,經此List容器轉換成資料表容器。所以,點按[記錄工具]底下[轉換]索引標籤裡的[成為資料表]命令按鈕。
開啟[到表格]對話方塊,直接點按[確定]按鈕。
形成一個名為[Column1]的單一資料行,儲存著兩筆資料記錄,其內容也都是Record容器,由於現在已經是資料表結構了,因此,可以透過展開資料行的操作,將資料行裡的內容全部展開。
在展開[Column1]資料行的下拉選單中,看到Record容器裡所記錄的[分店]、[店長]、[個資]與[成員]等四個資料行,在此勾選選取所有的資料行,並取消[使用原始資料行名稱做為前置詞]核取方塊的勾選。
隨即看到當下展開的成果,[分店]與[店長]內容都是文字型態的資料,而[個資]資料行的內容是Record容器,裡面存放著店長的個資;[成員]資料行的內容是List容器,裡面存放著該分店有多少位成員,因為成員人數不一,所以此資料行的內容採用List資料容器。我們先展開[個資]資料行的Record容器,也可以當下看出此Record容器裡記錄了每一家分店的店長其[性別]、[年齡]、[血型]與[學歷]等四個資料行,在此勾選選取所有的資料行,並取消[使用原始資料行名稱做為前置詞]核取方塊的勾選。
緊接著請展開[成員]資料行的List容器,在從下拉式選單中選擇[展開至新資料列]功能選項,便可以看到轉換成好幾筆資料列,原來這些List容器裡所儲存為數不一個元素都是Record型態的容器。也就是每一家分店都有著為數不一的成員,而每一個成員的基本資料則以Record型態的容器儲存著。因此,我們就再次點按此[成員]資料行的展開按鈕,從拉選單中可以看到Record容器裡所記錄的是每位成員的[工號]、[姓名]、[年資]與[專長]等四個資料行,在此勾選選取所有的資料行,並取消[使用原始資料行名稱做為前置詞]核取方塊的勾選。
這時候我們也發覺[工號]、[姓名]資料行都是文字型態的內容;[年資]資料行是數值型態的內容;而[專長]資料行的內容則是List容器,因為,每一位成員的專長項目不只一項,將此資料行的內容設定成可以儲存內容為數不一的清單型態,的確是不錯的規劃。而此例中[專長]List容器裡的元素是多項文字資料,在展開List後也不見得一定要一列列的呈現,所以,此次我們在展開List的操作上,可以選擇[擷取值]功能選項,將List容器裡的各個元素都串接在一起。
在開啟[擷取清單的值]對話方塊裡,我們選擇以[分號]來串接List裡每一個元素,也就是每位成員的每一項專長都以[分號]做為分隔符號。
完成的資料轉換成果如下:
當然,若以關聯是資料的表達與呈現,您也可以將上述的查詢結果,透過Power Query分解出兩個查詢結果,再去設定兩資料表的主從關係,架構如下,有興趣就動手做做看吧!
JSON格式的檔案,其匯入與轉換的過程,大都是見招拆招,不斷累積各種不同內容、架構與情境的資料轉換,希望這系列文章的學習與實作,對您在JSON檔案格式與Power Query的容器觀念及相關操作,有一定的認識與幫助。
(下載實作檔案)
系列文章
(1/5) 物件的概念與結構
(2/5) 再談JSON的架構
(3/5) Power Query的容器
(4/5) Power Query匯入Json實務範例1
(5/5) Power Query匯入Json實務範例2