[開發] 在WP8上讀取XML/JSON的方法(1)

看板WindowsPhone作者 (WildDagger)時間10年前 (2014/02/06 21:46), 編輯推噓6(604)
留言10則, 8人參與, 最新討論串1/1
市面上(中文)的教學書似乎蠻少提到這塊的 (說起來Android也頗少見,而且我找到的幾本講的也不怎麼清楚......) 因為網路的Opendata、RSS和政府開放資料平台的資訊幾乎都是用這兩個類型 甚至如果是資訊介紹類的APP, 也可以利用這兩個格式把資料給獨立出來不用寫在程式裡面, 也許善加利用的話說不定就能做出還不錯的APP嘍(? 不過這篇文章偏長,這篇會先講解JSON與XML格式與寫法, 下篇再提怎麼用Windows Phone SDK來讀取 (這邊也要先提醒因為我目前只開發Windows Phone 8.0的APP, 7.0系的APP能不能這樣搞我還沒試過,若要開發7.0的可能要先測試一下才行) (P.S. 用教學來搜索的話前面也有一篇講JSON與XML的,可以參考一下喔) 首先說明一下JSON的格式, 雖然網路上都找的到,不過還是略提一下 JSON格式的特點就是如名字般將一個物件資訊寫成Java Script的物件定義程式碼 首先是以{}來包住物件,其中再以「"屬性名稱": (屬性內容)」來包裝物件的屬性, 屬性內容可能包括以""來標記的字串以true/false來標記的布林值以[]來標記的陣列值、甚至是再一個{}的物件什麼都不加的數字 而這些屬性會以「,」來隔開。 (注意一下屬性名稱都是字串,所以要用""標記起來) 以我的空氣品質APP而言, 我從環保署的網站接收的JSON資料的其中一個物件就會標記成這樣: { "SiteName":"二林", "County":"彰化縣", "PSI":"60", "MajorPollutant":"懸浮微粒", "Status":"普通", "SO2":"5", "CO":".44", "O3":"50", "PM10":"71", "PM2.5":"31", "NO2":"19", "WindSpeed":"2.03", "WindDirec":"44.32", "PublishTime":"2014-02-06 20:00" } 雖然我有分段與縮排,但JSON的格式其實不需要這樣, 只要有照上面的要求隔開來,一長串的字串都沒問題。 怎麼寫JSON檔呢?基本上普通的記事本就萬事OK, Visual Studio也有支援格式化的JSON編輯,不過還是自己手打會比較快。 基本上照著規定來寫準沒錯。 屬性名稱的部分,你知道那是甚麼就沒關係。 ----------------------------------- XML則是另外一種類型, 有接觸過網頁的應該都會知道網頁用的是<HTML></HTML>這類的標籤 XML也是差不多的格式,但是比起HTML, 因為XML本身「毫無反應,就只是個資料」, 亦即你直接開XML,他也真的只會給你看一堆冷冰冰的標籤與資料, 所以撰寫XML時不需要去思考「怎麼讓資料變的花俏引人注目」, 只需要去思考怎麼讓你的資料容易被人(當然包括自己)搞清楚怎麼塞的就好。 這邊我就以我的航太APP為例, 裡面的格式是這個樣子: <?xml version="1.0" encoding="utf-8" ?> <Satellites> <Satellite ID="FORMOSAT-1"> <Name> <Language lang="zh-TW" value="福爾摩沙衛星一號(中華衛星一號)" /> <Language lang="en-US" value="FORMOSAT-1" /> </Name> <Code>FORMOSAT-1(ROCSAT-1)</Code> <Status>RETIRED</Status> <Image> <Icon>Formosat-1_Icon.png</Icon> <Wide></Wide> <Intro>http ://***********.jpg</Intro> </Image> <Date> <Launch Year="1998" Month="1" Day="27" Hour="" Minute="" Second="" Result="Success"/> <Retire Year="2004" Month="6" Day="17" Hour="" Minute="" Second=""/> </Date> </Satellite> (以下省略) </Satellites> 基本上第一行的<?xml version="1.0" encoding="utf-8" ?>是XML必備宣告 不宣告的話開資料的就不知道這是個XML檔,有可能會發生不明錯誤, 除此之外只有幾個比較需要注意: 1. 最外層的<Satellites></Satellites>是根標籤, 一個XML只能有一個,超過的話系統解讀時就會跟你報錯 (一個國家有兩三個總統不會大亂內戰才怪吧?同理可證) 2. 從裡面的資料也看得出來,根標籤底下的標籤要怎樣處理可以自訂, 格式也沒有一定規範,更因為沒有像HTML與XAML那樣還要負擔顯示資料的責任 (謎:說的好像XML很不負責任似的) 幾乎可說是想怎麼寫就怎麼寫 (只要你看得懂就好,但是如果要跟他人共享資料的話資料結構就要定下來不能亂改) 3. XML一定要有開始標籤與結尾標籤,如果標籤要單個結尾的話, 這個標籤最後要以「/>」作為結束,不然系統解讀時也會跟你報錯。 4. HTML在屬性的規定上非常寬鬆,可以不用加雙引號,有的甚至連等號也可以不用, 但在XML這套可行不通,一定要乖乖寫成「屬性名稱="屬性內容"」, 否則系統解讀時也會直接報錯。 (系統報錯有多嚴重呢? 至少是你在偵錯的時候會停下來要你解決,實機運作時會直接閃退導致過不了審查) 因為XML出現的比較早,大多數程式語言編輯軟體都支援XML的編輯, (當然記事本一樣OK) 甚至也有像是Code Writer這種Win8 APP可以幫助編寫 (很可惜的是根據開發公司的說法,受限於API的不足,Code Writer沒辦法使用IME, 也就是說在Code Writer中只能輸入英文,中文要自己另外開記事本處理) (Android本身介面布置檔就是用XML寫的這點應該很多教學書籍都有提到) 這些編輯程式也會很盡責的提醒你哪裡寫錯了, 比較高階一些的還會自動產生出可以摺疊的+-樹狀圖讓你更容易知道架構與編輯XML 此外,EXCEL(至少2007家用版)也可以透過開啟開發人員選項, 讀入已經自訂好格式的XSD/XML格式後, 自動產生出XML檔,這樣就可以不用老是自己手動打那些重複標籤了。 (當時用這個功能把一整個高達50000多行的XLS票價檔自動轉成一個XML真讓我感動到哭) --------------------------------------------------------------- 由於Windows 8.1現在的APP範本資料檔都改成用JSON檔,新增刪除都比較容易了 也許接觸到JSON的可能性會比較高,而且XML字量以及一目不了然度都比JSON還要多要大 JSON編寫的簡易程度也比XML高,或許可能會有人覺得XML好像沒甚麼用, 但並不是真的如此,資料檔要用什麼格式是你的自由 如果要我區分一下用途的話,我會這麼想: 格式較簡單,沒有太多階層的話適合用JSON; 格式較複雜,會有多階層的話還是比較適合用XML 雖然說JSON也可以物件裡面再包一個物件或陣列, 但好幾層編輯起來反而更容易變得比XML還難懂,因為結構整個複雜化了 若是這種情況還是用XML會比較好吧? (當然也可以用各種方式來讓結構單純化啦) 不過不管怎樣,資料的收集、取捨與編寫是很重要的一件事 有心做APP的人千萬別小看這點了喔 (寫到這邊又會想起怎麼好像大部分教寫APP的書都不會特別提到這種事呢......) 讀取XML與JSON檔的方法下篇繼續(汗 -- 要奉命結婚? 還是要尋找自己的幸福? ├────┤ ├────┤ ├────┤ ├────┤ ├────<═══ by kudo070125 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.250.44.64

02/06 21:49, , 1F
專業給推
02/06 21:49, 1F
※ 編輯: hoyunxian 來自: 111.250.44.64 (02/06 21:50)

02/06 21:52, , 2F
先推了 同樓上推專業
02/06 21:52, 2F

02/06 21:54, , 3F
抱歉 看不懂 但還是推個
02/06 21:54, 3F

02/06 22:02, , 4F
建議盡量不要用 XML,軟體讀取 XML 其實很耗資源
02/06 22:02, 4F

02/06 22:26, , 5F
Step1. Paste JSON As Classes
02/06 22:26, 5F

02/06 22:27, , 6F
Step2. JsonConvert.DeserializeObject<T>
02/06 22:27, 6F

02/06 22:27, , 7F
其他交給樓主詳細了XD
02/06 22:27, 7F

02/06 22:39, , 8F
感覺以後會用到 推
02/06 22:39, 8F

02/06 22:59, , 9F
專業推,但我還是先弄本入門書來研究
02/06 22:59, 9F

02/06 23:40, , 10F
專業推
02/06 23:40, 10F
文章代碼(AID): #1Iyv9DEc (WindowsPhone)