[轉貼] 透過Json.NET進行XML與Object轉換

2019080114:48
出處:https://yohey66.wordpress.com/2017/02/22/c-net-%E9%80%8F%E9%81%8Ejson-net%E9%80%B2%E8%A1%8Cxml%E8%88%87object%E8%BD%89%E6%8F%9B/
 

在做資料交換時,我們常會使用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到我們的物件上了,

1

2

接下來操作由物件轉為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));

3

結論:透過Json.NET的使用,便可發現處理這類資料時最麻煩的部分僅僅在於建立物件上,省去了許多一個節點一個節點去做轉換的功夫,至於建立對應物件的熟悉度,就有待各位自行練習了。

比較值得注意的是XML開頭的一些標頭,我們可以透過如上最後一行程式碼把它加上去,即可快速的組成Xml囉!

補充:刪除null值的節點 – MSDN