2013年12月28日 星期六

練習題 - 將 QueryString 字串轉換為指定型別的物件

這個題目其實蠻簡單的,有時後會需要將接收到的 QueryString 再加以處理,因為 QueryString 是屬於 NameValue 的結構,如下:

ID=12345678&FirstName=OOO&LastName=xxx

如果 QueryString 的內容不是又臭又長的時候,可以直接使用 HttpUtility.ParseQueryString() 方法將 QueryString 轉換為 NameValueCollection,然後可以依據 Name 來取得 Value 的內容。

但需要將 QueryString 轉成指定型別的物件呢?好像沒有內建的方法是可以直接將 NameValueCollection 轉成物件,不過還是有方法可以做這樣的處理,只是需要多做幾次簡單的轉換處理而已。

 


HttpUtility.ParseQueryString

http://msdn.microsoft.com/zh-tw/library/ms150046(v=vs.110).aspx

使用 UTF8 編碼,將查詢字串剖析為 NameValueCollection。

看一個簡單的操作就可以知道怎麼使用,

image

 

那如果我們有定義一個型別,並且希望接收到的 QueryString 能夠轉換成這一個型別的物件時,應該怎麼處理呢?

image

這邊我使用 Json.NET 來做進一步的處理,因為我們已經可以使用 HttpUtility.ParseQueryString() 取得 NameValueCollection,而我們可以使用 Json.NET 的 JsonConvert.SerialObject() 方法將 NameValueCollection 先轉為 JSON 字串,

image

可以轉成 JSON 字串之後就可以使用 JsonConvert.DeserializeObject<T>() 方法將 JSON 字串反序列化成指定行別的物件,

image

最後將中間轉換的處理抽出來做成一個 Helper 方法,就可以重複的使用,

image

 

會這樣處理的需求是因為有時候我們所接收到的 QueryString 是有多組 Name Value 所組成的,如果還用一個一個組裝成物件的方式就會蠻累的,尤其是這樣的處理在系統中時常出現的時候,開發人員就會覺得厭煩,這個時候就可以用這樣的處理方式來省略這些煩人的工作。

 

參考連結:

Json.NET Document  - JsonConvert.SerializeObject()

Json.NET Document - JsonConvert.DeserializeObject<T>()

http://stackoverflow.com/questions/18711721/jsonconvert-deserializeobjecttjsonstring-returning-all-propertiest-as-null

 

以上

2 則留言:

  1. 忘了補充說明,我用的是 LINQPad,之前 Workshop 也有介紹過喔
    除了可以用來練習與測試 LINQ 操作之外,也可以作為簡易的 C# 編輯器,
    部落格有文章介紹.

    回覆刪除
  2. 現在才發現NameValueCollection不能序列化...OTZ

    回覆刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。