JSON作為一種輕量級(jí)的數(shù)據(jù)交換格式,因其易于讀寫和交互的特點(diǎn),已逐漸成為主流的數(shù)據(jù)類型之一。常見的編程語言大多都對(duì) JSON 的讀取與解析提供了接口,但是接下來如何把多層 JSON 數(shù)據(jù)經(jīng)過篩選、計(jì)算并展開成二維數(shù)據(jù),就需要開發(fā)人員去頭疼了。本文就為大家分享一下如何利用集算器 SPL(結(jié)構(gòu)化處理語言)輕松解決 JSON 數(shù)據(jù)解析入庫的問題。
目前創(chuàng)新互聯(lián)建站已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、漢壽網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。JSON 數(shù)據(jù)文件導(dǎo)入與解析
根據(jù) JSON 數(shù)據(jù)文件的復(fù)雜程度,以及不同的需求,我們會(huì)分三種情況來討論:
1. 單層的 JSON 數(shù)據(jù)文件
我們先從一個(gè)簡單的例子入手,看看普通鍵值映射的 JSON 文件如何讀取。下面是某產(chǎn)品訂單信息的 JSON 數(shù)據(jù)文件:
SPL導(dǎo)入 JSON 數(shù)據(jù)文件只需要簡單的一句腳本:
= json(file("product.json").read()) |
不需要寫循環(huán)函數(shù),也不用解析 JSON 對(duì)象,執(zhí)行一下就可以看到,JSON 數(shù)據(jù)文件已經(jīng)轉(zhuǎn)換為二維數(shù)據(jù)序表了:
2. 明細(xì)數(shù)據(jù)相同結(jié)構(gòu)的多層 JSON 數(shù)據(jù)文件
接下來,我們看一下多層的 JSON 文件如何處理。下面是我們要用到的 JSON 數(shù)據(jù)文件 orders.json:
可以看到,JSON 數(shù)據(jù)分為兩層,第一層是 "貨主國家" 和 "貨主地區(qū)",第二層是明細(xì)數(shù)據(jù)?,F(xiàn)在我們想要從中導(dǎo)入中國華北和華南地區(qū) 2013 年的訂單,讓我們看看如果用 SPL 實(shí)現(xiàn)。
這次我們先來定義一下參數(shù):Country、Area 和 Year,分別對(duì)應(yīng)需要導(dǎo)入的貨主國家、貨主地區(qū)和訂購日期的年份。通過定義參數(shù),以后導(dǎo)入不同國家、地區(qū)和年份的時(shí)候,就不再需要修改 SPL,只需要提供相應(yīng)的參數(shù)值就行了。這里需要注意的是,Area 的值是序列,默認(rèn)值是 [華北, 華南],這樣就可以同時(shí)讀取多個(gè)地區(qū)的數(shù)據(jù)。如下圖:
我們先看一下 SPL 腳本:
A | B | |
1 | =json(file("orders.json").read()) | =A1.select(貨主國家 ==Country && Area.contain( 貨主地區(qū))) |
2 | =B1.news(區(qū)域訂單;B1. 貨主國家: 貨主國家,B1. 貨主地區(qū): 貨主地區(qū),#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13) | =A2.select(year( 訂購日期)==Year) |
下面來詳細(xì)解釋一下:
第一步:A1 中 =json(file("orders.json").read()),導(dǎo)入 JSON 文件生成序表。執(zhí)行一下,可以看到 JSON 數(shù)據(jù)按層級(jí)被展現(xiàn)出來(在集算器設(shè)計(jì)器中我們可以通過雙擊“區(qū)域訂單”值,來查看下一層明細(xì)數(shù)據(jù)):
第二步:從圖中可以看到,"貨主國家" 和 "貨主地區(qū)" 字段就在第一層,因此在 B1 中直接調(diào)用A1.select(貨主國家 ==Country && Area.contain( 貨主地區(qū))) 就可以篩選出中國華北和華南的數(shù)據(jù)。
第三步:"區(qū)域訂單" 是我們想要的明細(xì)數(shù)據(jù),但是其中不包含 "貨主國家" 和 "貨主地區(qū)" 這兩個(gè)字段,因此我們需要把這兩個(gè)字段和區(qū)域訂單的明細(xì)字段拼在一起。這么復(fù)雜的需求通過 news 函數(shù)就可以一步到位解決。從 A2 格的表達(dá)式可以看到參數(shù)并不復(fù)雜,把 B1. 貨主國家,B1. 貨主地區(qū)和 "區(qū)域訂單" 的全部字段拼在一起就可以了。看下執(zhí)行結(jié)果:
第四步:在 B2 中通過=A2.select(year( 訂購日期)==Year)篩選出 "訂購日期" 的年份是 2013 年的數(shù)據(jù)。
最后讓我們執(zhí)行一下,可以看到最終得到的二維表完全符合需求:
3. 明細(xì)數(shù)據(jù)不同結(jié)構(gòu)的多層 JSON 數(shù)據(jù)文件
因?yàn)閿?shù)據(jù)來源的復(fù)雜性,JSON 數(shù)據(jù)文件的明細(xì)數(shù)據(jù)有可能是不同結(jié)構(gòu)的,我們一起看一下這種 JSON 文件如何處理。下面是我們要用到的 JSON 文件 sales.json:
第一層以年和月為維度,第二層以國家為維度,第三層是明細(xì)數(shù)據(jù)。但是明細(xì)數(shù)據(jù)中,由于銷售渠道不同,結(jié)構(gòu)是不完全一致的,比如 "PRODUCTLINE"、"ADDRESSLINE1"、"ADDRESSLINE2" 在明細(xì)數(shù)據(jù)中并不是必須的?,F(xiàn)在,我們要從數(shù)據(jù)中讀取 2017 和 2018 年北美兩個(gè)大國美國和加拿大的銷售數(shù)據(jù)。
為了使用方便,我們還是先定義兩個(gè)參數(shù):Year 和 Country:
接下來先看一下 SPL:
A | B | |
1 | =json(file("sales.json").read()) | =A1.select(Year.contain(YEAR)) |
2 | =B1.news(MONTHLY_SALES;B1.YEAR:YEAR,B1.MONTH:MONTH,#1,#2) | =A2.select(Country.contain(COUNTRY)) |
3 | =B2.news(NATIONAL_MONTHLY_SALES;B2.YEAR:YEAR,B2.COUNTRY:COUNTRY,ORDERNUMBER,QUANTITYORDERED,PRICEEACH,ORDERLINENUMBER,SALES,ORDERDATE,STATUS,QTR_ID,PRODUCTLINE,MSRP,PRODUCTCODE,CUSTOMERNAME,PHONE,ADDRESSLINE1,ADDRESSLINE2,CITY,STATE,POSTALCODE,TERRITORY,CONTACTLASTNAME,CONTACTFIRSTNAME,DEALSIZE) |
下面來詳細(xì)解釋一下。
A1格還是把 JSON 文件導(dǎo)入為多層序表。
由于年份字段就在第一層,B1 格中直接調(diào)用A1.select(Year.contain(YEAR))可以從 A1 中篩選出 2017 和 2018 年份的數(shù)據(jù):
接下來 A2 格中我們?cè)俅斡玫搅?news 函數(shù),用來把年月字段和下一層的月銷售明細(xì)拼在一起:
B2格中我們通過A2.select(Country.contain(COUNTRY))從中篩選出來美國和加拿大的數(shù)據(jù)。
然后在 A3 格中,我們?cè)俅斡玫搅?news 函數(shù),這次需要把 YEAR,MONTH,COUNTRY 和再下一層的國家月銷售明細(xì)拼在一個(gè)序表中。由于這個(gè)文件中明細(xì)數(shù)據(jù)可能結(jié)構(gòu)有所不同,我們使用全量的字段名作為參數(shù)來創(chuàng)建序表。字段的值會(huì)根據(jù)名稱設(shè)置,無此字段的會(huì)缺省為空值(例如下圖 "ADDRESSLINE1" 和 "ADDRESSLINE2" 字段):
執(zhí)行后可以看到最終結(jié)果:
至此,一個(gè)多層結(jié)構(gòu)的明細(xì)數(shù)據(jù)結(jié)構(gòu)不完全一致的 JSON 文件就成功展開成為一個(gè)二維表了。
序表入庫
前面介紹了常見的 JSON 數(shù)據(jù)文件導(dǎo)入與解析,接下來是數(shù)據(jù)入庫的問題。之所以在最后才說入庫,并不是因?yàn)閺?fù)雜,恰恰相反的是,由于前面的例子中最后生成的都是序表,因此更新數(shù)據(jù)庫就變得非常簡單方便。以前面導(dǎo)入 JSON 的例子 2 中的訂單表為例:
A | |
1 | =file("orders.json").read().import@j().select(貨主國家 ==Country && 貨主地區(qū) ==Area). 區(qū)域訂單.select(year( 訂購日期)==Year).derive(Country: 貨主國家,Area: 貨主地區(qū)) |
2 | =connect("demo").update(A1, 訂單; 訂單 ID) |
可以看到,更新數(shù)據(jù)庫只需要一句腳本!
這里是比較常見的通過主鍵更新,用序表 A1 通過主鍵訂單 ID 來更新數(shù)據(jù)庫中的訂單表。SPL 中的 update 函數(shù)有很多選項(xiàng),可以滿足更多的更新數(shù)據(jù)需求,這里就不再一一贅述了。
因此,只要用對(duì)了工具,從 JSON 文件導(dǎo)入解析到數(shù)據(jù)入庫,再繁瑣的任務(wù)也可以輕松應(yīng)對(duì)。除了 JSON 數(shù)據(jù)文件,集算器 SPL 還支持各種豐富多樣的數(shù)據(jù)來源,后續(xù)將通過更多的文章繼續(xù)分享給大家。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站標(biāo)題:輕松應(yīng)對(duì)多層JSON數(shù)據(jù)計(jì)算與入庫-創(chuàng)新互聯(lián)
本文地址:http://aaarwkj.com/article12/dddigc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管、微信公眾號(hào)、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容