在做資料交換時,我們常會使用Json格式或是XML格式來進行。
但若選擇使用XML,則在程式中需透過XML的轉換來將資料mapping到我們的物件上或是要冗長的Create Node來產生XML以便進行操作。
先前有篇文章在說明如何透過XmlDocument來取得XML的節點資料,可參考[.NET MVC] 解決XmlReader ReadElementContentAs* 方法會跳過元素之替代方案。
若資料節點相當的多,程式要一行一行的去針對每個點去處理,豈不就相當麻煩?
秉持著懶惰的心態,去思考如果可以把程式中的物件直接對應轉換成XML,那豈不就只要準備好我們要的物件,便可以簡單的做轉換,無須在一個node一個node去做處理,
簡單查了一下資料,發現Json.NET可以幫我們做到這件事!
需求:將如下的XML格式轉換成物件,以及從物件轉成如下的XML格式
1 2 3 4 5 6 7 8 9 10 11 |
<? xml version = "1.0" encoding = "utf-8" ?> < HEADER > < UserID >A1234567</ UserID > < UserName >王曉明</ UserName > < UserDesc >handsome</ UserDesc > < Family > < Member >阿爸</ Member > < Member >阿母</ Member > < Member >阿姐</ Member > </ Family > </ HEADER > |
首先先產出對應的巢狀物件(注意Property的名稱要與Xml的節點名稱相同),如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Response { public Header HEADER { get ; set ; } } public class Header { public string UserID { get ; set ; } public string UserName { get ; set ; } public string UserDesc { get ; set ; } public Family Family { get ; set ; } } public class Family { public List< string > Member { get ; set ; } } |
將XML轉成物件的方式如下:
1 2 3 4 5 6 7 8 9 10 11 |
// 取得如上的XML字串 string xmlInput = GetXmlData(); // 透過XmlDocument讀入 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlInput); // 讀取HEADER節點 XmlNode responseNode = xmlDoc.SelectSingleNode( "/HEADER" ); // 透過Json.NET將XmlNode轉為Json格式字串 string jsonText = JsonConvert.SerializeXmlNode(responseNode); // 透過Json.NET反序列化為物件 Response responseObj = JsonConvert.DeserializeObject<Response>(jsonText); |
如此一來,便可以將XML mapping到我們的物件上了,
接下來操作由物件轉為Xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 初始化物件 Response responseObj = new Response(); responseObj.HEADER = new Header(); responseObj.HEADER.Family = new Family(); responseObj.HEADER.Family.Member = new List< string >(); // 給予值 responseObj.HEADER.UserID = "B987654" ; responseObj.HEADER.UserName = "張帥帥" ; responseObj.HEADER.UserDesc = "有點蟀" ; responseObj.HEADER.Family.Member.Add( "老爸" ); responseObj.HEADER.Family.Member.Add( "老媽" ); responseObj.HEADER.Family.Member.Add( "女朋友" ); // 將結果的object轉成XML格式後,加上標頭並回傳 string jsonText = JsonConvert.SerializeObject(responseObj); XmlDocument resultXml = JsonConvert.DeserializeXmlNode(jsonText); resultXml.PrependChild(resultXml.CreateXmlDeclaration( "1.0" , "utf-8" , null )); |
結論:透過Json.NET的使用,便可發現處理這類資料時最麻煩的部分僅僅在於建立物件上,省去了許多一個節點一個節點去做轉換的功夫,至於建立對應物件的熟悉度,就有待各位自行練習了。
比較值得注意的是XML開頭的一些標頭,我們可以透過如上最後一行程式碼把它加上去,即可快速的組成Xml囉!
補充:刪除null值的節點 – MSDN