亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【.NET深呼吸】如何反序列化動態JSON

2019-11-14 15:50:29
字體:
來源:轉載
供稿:網友

 

.net本身除了支持SOAP、xml、二進制等序列化和反序列化,后來也加入了對JSON的序列化的支持。然而,在實際開發中,常常會遇到結構不確定的JSON對象,這些對象可能是其他代碼動態生成的,你事先無法估計它的結構,甚至它的字段名字是動態改變的。

這種情況下,我們很難用一個固定的類來進行反序列化,后來我嘗試過從DynamicObject類派生出一個自定義的動態類型,希望通過這種方法能夠將動態生成的JSON讀出來,但結果依舊不可;后來我又實現了ISerializable接口,想著自行去控制一下數據的讀取,但仍然未果。

最終我總結出來,只有下面這個方法比較省事,并且可以做到將動態的JSON進行反序列化。

asp.net開發的朋友應該會熟悉一個類——位于System.Web.Script.Serialization命名空間下的javaScriptSerializer類。因為這個類是為Web開發服務的,其實可以用于整個.net框架,即你在WinForm、WPF等程序中依舊可以用。這個類的作用是將指定的JSON字符串進行序列化和反序列化,參與操作的類型可以是固定的,如果JSON是固定結構的,這樣就可行。而對于結構不固定的JSON,這個類可以以字典的形式進行操作,即調用DeserializeObject方法后會返回一個Object類型的對象,實際上這個對象是實現了IDictionary<string, object>接口的,這樣一來,反序列化的結果就可以作為字典來操作。如果JSON里面有嵌套的對象,則返回的字典對象中會嵌套著字典對象。

 

于是,我就寫了這么一個類:

    public sealed class JsonObjectReader    {        PRivate string innerJson = null;        public JsonObjectReader(string json)        {            innerJson = json;        }        public dynamic GetObject()        {            dynamic d = new ExpandoObject();            // 將JSON字符串反序列化            JavascriptSerializer s = new JavaScriptSerializer();            object resobj = s.DeserializeObject(this.innerJson);            // 拷貝數據            IDictionary<string, object> dic = (IDictionary<string, object>)resobj;            IDictionary<string, object> dicdyn = (IDictionary<string, object>)d;            foreach (var item in dic)            {                dicdyn.Add(item.Key, item.Value);            }            return d;        }    }


有人會問我,GetObject方法為什么要返回動態類型?是為了方便操作,ExpandoObject是一種簡單易用并且現成的動態類型,在C#中聲明變量時應用上dynamic關鍵字,告訴編譯器這家伙是動態類型,在編譯檢查時可以“網開一面”。而且,我發現ExpandoObject類是顯式實現了IDictionary<string, object>接口的,說明你還可以把它強制轉換為字典數據來操作。

這種做法一舉兩得,如果方便使用,就當成動態對象來訪問,在不方便使用時,也可以當作字典數據來用。

 

下面舉一個不方便使用動態訪問的例子:

            string json = "{" +                              "/"0592/" : /"廈門市/"," +                              "/"0351/" : /"太原市/"," +                              "/"0411/" : /"大連市/"," +                              "/"0459/" : /"大慶市/"" +                          "}";            JsonObjectReader rd = new JsonObjectReader(json);            dynamic res = rd.GetObject();            IDictionary<string, object> d = (IDictionary<string, object>)res;            foreach (var item in d)            {                Console.WriteLine($"{item.Key} = {item.Value}");            }

大伙會發現,這個JSON你是很難用常規方法進行反序列化的,因為它的字段是城市的區號,是不固定的,在聲明類時你無法事先確定類的屬性或字段成員。同時你也發現,字段名是數字的,就算以動態對象得到結果,你也不能以obj.0459這樣的語法來訪問,因為標識符是不能由數字開頭的。這種情況下不能用動態對象來訪問,但可以把它轉換為字典對象來處理。

得到結果如下圖。

 

 

但是,下面這種用法,因為JSON的字段名不是數字開頭,所以能夠以動態對象的方式訪問。

            json = "{/"Name/":/"小明/", /"Age/":25, /"Email/":/"abcd@dog.cc/"}";            JsonObjectReader rd2 = new JsonObjectReader(json);            dynamic res2 = rd2.GetObject();            Console.WriteLine($"姓名:{res2.Name}");            Console.WriteLine($"年齡:{res2.Age}");            Console.WriteLine($"電郵:{res2.Email}");

 因為Name、Age、Email這些字段不是數字開頭,符號標識符的規范要求,所以后面可以用res2.Name的方式來訪問,就像訪問普通對象實例一樣。

得到的結果如下圖。

 

最后要說明一下的是,這種方法只用于.NET框架的應用程序,如ASP.NET、WPF等。如果是Windows Store App的話,可以使用RT API中的JSON相關的類來處理,這些類都位于Windows.Data.Json命名空間。

 

示例代碼下載

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久中文字幕| 亚洲精品国产精品国自产观看浪潮| 国内外成人免费激情在线视频网站| 亚洲图片在线综合| 精品人伦一区二区三区蜜桃免费| 亚洲精品综合久久中文字幕| 国产91精品久久久久| 亚洲电影免费观看高清完整版在线观看| 欧美wwwxxxx| 国产丝袜一区二区三区免费视频| 91九色国产社区在线观看| 国产精品成人国产乱一区| 国产日韩欧美日韩| 成人xxxxx| 亚洲精品www久久久久久广东| 国产精品大片wwwwww| 成人网欧美在线视频| 日本一区二三区好的精华液| 亚洲老头老太hd| 欧美日韩福利视频| 国产精品久久久久久久7电影| 国产精品视频免费在线| 欧美老女人xx| 国产日韩欧美视频在线| 精品国产老师黑色丝袜高跟鞋| 国产精品视频久久| 岛国av午夜精品| 国产成人高清激情视频在线观看| 亚洲欧美成人一区二区在线电影| 欧美寡妇偷汉性猛交| 91夜夜揉人人捏人人添红杏| 国产一区二区三区毛片| 日本一区二区在线播放| 91久久嫩草影院一区二区| 97香蕉久久超级碰碰高清版| 久久久人成影片一区二区三区| 日韩免费观看高清| 精品亚洲一区二区三区在线观看| 精品视频久久久久久| 欧美一区深夜视频| 亚洲美女免费精品视频在线观看| 欧美在线视频观看| 日韩精品在线电影| 欧美大全免费观看电视剧大泉洋| 欧美高清理论片| 久久91精品国产91久久久| 成人a在线观看| 4388成人网| 久久国产精品免费视频| 97视频在线观看免费| 精品国产91久久久久久老师| 久久久精品久久久久| 精品久久久91| 亚洲国产天堂网精品网站| 欧美在线一级va免费观看| 国产亚洲a∨片在线观看| 国精产品一区一区三区有限在线| 日日噜噜噜夜夜爽亚洲精品| 欧美黄网免费在线观看| 九九热99久久久国产盗摄| 4p变态网欧美系列| 亚洲欧美中文字幕在线一区| 精品二区三区线观看| 国产精品av电影| 国产精品日韩专区| 亚洲欧美自拍一区| 亚洲美女av电影| 9.1国产丝袜在线观看| 亚洲欧洲成视频免费观看| 久久天天躁日日躁| 亚洲欧美综合图区| 成人网页在线免费观看| 97视频在线播放| 亚洲精品一区在线观看香蕉| 国产女人精品视频| 亚洲精品国精品久久99热| 91精品视频免费观看| 亚洲精品电影在线| 国产精品盗摄久久久| 精品国产31久久久久久| 欧美激情a∨在线视频播放| 日韩欧美在线视频观看| 国产成人精品综合| 国产成人a亚洲精品| 欧美放荡办公室videos4k| 91精品视频大全| 91中文字幕在线观看| 国产精品主播视频| 欧美在线欧美在线| 欧美激情中文字幕乱码免费| 91精品国产99久久久久久| 5278欧美一区二区三区| 成人久久一区二区| 国产成人综合一区二区三区| 国产成人精品一区| 国产日韩精品视频| 成人黄色网免费| 91中文字幕一区| 欧美日韩国产999| 91亚洲国产成人久久精品网站| 亚洲成人精品在线| 国产福利视频一区二区| 国产午夜精品全部视频在线播放| 国产亚洲激情视频在线| 成人精品在线观看| 日韩精品亚洲视频| 成人欧美一区二区三区在线湿哒哒| 亚洲国产毛片完整版| 亚洲a在线观看| 成人免费xxxxx在线观看| 亚洲国产精品久久久久秋霞蜜臀| 久久精品久久精品亚洲人| 亚州av一区二区| 久久久久久久一区二区| 国产精品视频xxx| 91精品久久久久久久久| 欧美裸体xxxx极品少妇软件| 国产成人激情视频| 亚洲第一福利在线观看| 亚洲a级在线播放观看| 日韩精品丝袜在线| 日韩美女视频中文字幕| 国产精品久久久久久久美男| 97视频人免费观看| 成人黄色片在线| 久久视频精品在线| 久久久中精品2020中文| 91精品在线影院| 在线观看国产精品淫| 亚洲情综合五月天| 精品网站999www| 91精品久久久久久久久久久| 久久精品91久久久久久再现| 丁香五六月婷婷久久激情| 久久久久国产精品免费| 国产精品久久久久aaaa九色| 亚洲自拍偷拍色图| 国内外成人免费激情在线视频| 国产精品黄页免费高清在线观看| 欧美日韩国产精品| 国产91ⅴ在线精品免费观看| 亚洲乱码一区av黑人高潮| 免费成人高清视频| 欧美制服第一页| 日韩美女福利视频| 亚洲欧洲免费视频| 播播国产欧美激情| 久久国产天堂福利天堂| 5278欧美一区二区三区| 成人网在线免费看| 久久6精品影院| 川上优av一区二区线观看| 久久久久久999| 国产丝袜一区二区三区| 欧美极品第一页| 91性高湖久久久久久久久_久久99| 97久久国产精品| 亚洲va国产va天堂va久久| 色阁综合伊人av| 国产一区二区黑人欧美xxxx| 亚洲精品乱码久久久久久金桔影视| 国产91在线播放| 国产999在线观看| 91精品国产高清久久久久久久久|