JSON全稱(chēng)為JavaScript Object Notation,原本作為JavaScript語(yǔ)言中用于表示對(duì)象結(jié)構(gòu)的文本形式。不過(guò)目前JSON成功地脫離了JavaScript語(yǔ)言,它已經(jīng)成為一種運(yùn)用十分廣泛的數(shù)據(jù)交換格式。從表面看來(lái),目前用于某個(gè)對(duì)象與JSON格式之間相互轉(zhuǎn)化的解決方案已經(jīng)有了許多種,例如在.NET平臺(tái)上,我們可以使用ASP.NET AJAX中引入的JavaScriptSerializer,WCF中引入的DataContractJsonSerializer,亦或是Json.NET。但是,最近我忽然發(fā)現(xiàn)這些類(lèi)庫(kù)都無(wú)法滿足我的要求,因此,我今天花了一點(diǎn)時(shí)間,寫(xiě)了一個(gè)非常簡(jiǎn)單的對(duì)象與JSON格式相互轉(zhuǎn)化的類(lèi)庫(kù),是為JsonMe。
現(xiàn)有解決方案的不足
您可能會(huì)感到疑惑,難道現(xiàn)有的解決方案都不夠好嗎?又搞一個(gè)新的實(shí)現(xiàn)出來(lái),這不是重復(fù)造輪子嘛。但事實(shí)上,它們?cè)谖已劾,都有一些難以逾越的障礙。就拿JavaScriptSerializer來(lái)說(shuō),它使用起來(lái)十分簡(jiǎn)單,配合C#的匿名對(duì)象特性,輸出一個(gè)JSON格式可謂無(wú)比直接:
var value = new { hello = "world", array = new object[] { 1, 2, 3, "jeffz" } }; var json = new JavaScriptSerializer().Serialize(value);
JavaScriptSerializer也支持JSON格式與某種類(lèi)型的對(duì)象相互轉(zhuǎn)化,甚至可以加上ScriptIgnoreAttribute標(biāo)記來(lái)忽略某個(gè)屬性,例如:
public class Post { public string Title { get; set; }
[ScriptIgnore] public string Content { get; set; }
public DateTime CreateTime { get; set; } }
如果我想要改變某個(gè)屬性在JSON中的字段名呢?JavaScriptSerializer應(yīng)該也做得到,但我現(xiàn)在我一時(shí)想不起來(lái)了,也懶得去查。我知道DataContractJsonSerializer一定支持,事實(shí)上它是.NET中用于代替JavaScriptSerializer的JSON序列化解決方案,為此如今的JavaScriptSerializer已經(jīng)標(biāo)記了ObsolateAttribute,編譯時(shí)您應(yīng)該可以看到warning。
那么我再提一個(gè)要求:在序列化某個(gè)字段的時(shí)候,對(duì)它的值進(jìn)行一個(gè)簡(jiǎn)單的轉(zhuǎn)化。例如,我希望將DateTime對(duì)象在JSON中表現(xiàn)為字符串,這對(duì)于JavaScriptSerializer和DataContractJsonSerializer來(lái)說(shuō)似乎就做不到了,至少會(huì)十分麻煩。但是這對(duì)于Json.NET來(lái)說(shuō)不是個(gè)問(wèn)題,相比于前兩者來(lái)說(shuō),Json.NET可謂是JSON解決方案中的Word和Excel,經(jīng)過(guò)了許多版本的積極開(kāi)發(fā),如今的Json.NET已經(jīng)實(shí)現(xiàn)了大量的功能,幾乎在每一處都提供了擴(kuò)展點(diǎn)。我對(duì)Json.NET的了解不多,不過(guò)在簡(jiǎn)單瀏覽代碼以后,我發(fā)現(xiàn)它的復(fù)雜度已經(jīng)能和如今的ASP.NET MVC比肩了,是不是顯得有些可怕?我也這么覺(jué)得。
但事實(shí)上,讓我重新寫(xiě)一個(gè)JsonMe的關(guān)鍵,是因?yàn)槲蚁M环N類(lèi)型能夠與不同的JSON格式相互轉(zhuǎn)化。試想,我有一個(gè)User類(lèi)型,但是我卻有兩個(gè)不同格式的JSON數(shù)據(jù)源;蛘哒f(shuō),相同的User對(duì)象,需要根據(jù)環(huán)境得到兩種不同格式的JSON輸出。這樣JavaScriptSerializer或DataContractJsonSerializer就無(wú)法滿足我的要求了,因?yàn)樗鼈兪褂米远x特性來(lái)控制JSON的格式,但一個(gè)類(lèi)型只能應(yīng)用一種JSON策略,這又讓我如何是好?
出處:老趙點(diǎn)滴
責(zé)任編輯:bluehearts
上一頁(yè) 下一頁(yè) 輕量級(jí)JSON映射類(lèi)庫(kù) [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|