日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

        歡迎訪問(wèn) 生活随笔!

        生活随笔

        當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

        编程问答

        WebApi接口 - 响应输出xml和json 转

        發(fā)布時(shí)間:2024/4/15 编程问答 43 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 WebApi接口 - 响应输出xml和json 转 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

        格式化數(shù)據(jù)這東西,主要看需要的運(yùn)用場(chǎng)景,今天和大家分享的是webapi格式化數(shù)據(jù),這里面的例子主要是輸出json和xml的格式數(shù)據(jù),測(cè)試用例很接近實(shí)際常用情況;希望大家喜歡,也希望各位多多掃碼支持和點(diǎn)贊謝謝:

        ?

        . 自定義一個(gè)Action,響應(yīng)輸出集合數(shù)據(jù)

        . api返回json數(shù)據(jù)的兩種方式

        . json時(shí)間格式處理方式

        . 讓api接口支持返回json和xml數(shù)據(jù)

        ?

        下面一步一個(gè)腳印的來(lái)分享:

        . 自定義一個(gè)Action,響應(yīng)輸出集合數(shù)據(jù)

        首先,我們新建一個(gè)webapi項(xiàng)目,新建好以后我們能夠找到?Controllers/ValuesController.cs?文件,查看里面有自動(dòng)生成的一些代碼,我們先不管;然后我們創(chuàng)建一個(gè)學(xué)生?MoStudent?類(lèi),屬性代碼如:

        1 public class MoStudent 2 { 3 public DateTime Birthday { get; set; } 4 5 public int Id { get; set; } 6 7 public string Name { get; set; } 8 9 public bool Sex { get; set; } 11 }

        然后我們?cè)?ValuesController?中初始化一些公共的數(shù)據(jù),代碼如:

        1 public List<MoStudent> students = new List<MoStudent>() { 2 3 new MoStudent{ Id =1 , Name ="小1", Sex = true, Birthday= Convert.ToDateTime("1991-05-31")}, 4 new MoStudent{ Id =2 , Name ="小2", Sex = false, Birthday= Convert.ToDateTime("1991-05-31")}, 5 new MoStudent{ Id =3 , Name ="小3", Sex = false, Birthday= Convert.ToDateTime("1991-05-31")}, 6 new MoStudent{ Id =4 , Name ="小4", Sex = true, Birthday= Convert.ToDateTime("1991-05-31")} 7 };

        再來(lái),我們新創(chuàng)建一個(gè)?GetAllStudents01()?方法,并輸出學(xué)生集合數(shù)據(jù),代碼如:

        1 public List<MoStudent> GetAllStudents01() 2 { 3 return students; 4 }

        這個(gè)時(shí)候我們生成一下項(xiàng)目,然后在瀏覽器訪問(wèn)下地址為:?http://localhost:1001/api/values?,此時(shí)會(huì)提示一個(gè)錯(cuò)誤信息:

        這個(gè)錯(cuò)誤信息是該地址同時(shí)匹配上了兩個(gè)api的Action,分別為?Get()和GetAllStudents01()?兩個(gè)方法,這種錯(cuò)誤我們應(yīng)該怎么處理呢;一種可以刪除其中一個(gè)方法;二種方式是在默認(rèn)路由設(shè)置下Action,然后通過(guò)具體的Controller/Action地址來(lái)訪問(wèn);三種是通過(guò)Route修改下對(duì)應(yīng)的訪問(wèn)路由(這種方法前面一篇文章已經(jīng)有說(shuō)明);這里我們就使用第二種,先來(lái)修改下?WebApiConfig.cs?文件中默認(rèn)路由的配置,修改后的配置如:

        1 config.Routes.MapHttpRoute( 2 name: "DefaultApi", 3 routeTemplate: "api/{controller}/{action}/{id}", 4 defaults: new { id = RouteParameter.Optional } 5 );

        生成后,我們?cè)跒g覽器中這樣訪問(wèn):?http://localhost:1001/api/values/GetAllStudents01?,GetAllStudents01是對(duì)應(yīng)要訪問(wèn)的Action名稱(chēng),不出意外我們能在瀏覽器中看到如下結(jié)果:

        webapi能正常返回?cái)?shù)據(jù)了,但是地址感覺(jué)好長(zhǎng)的樣子,不利于我們測(cè)試,那么下么我們使用上一篇文章用到的標(biāo)記RoutePrefixRoute來(lái)變動(dòng)下路由,增加的代碼如:

        然后我們測(cè)試訪問(wèn)下該地址:?http://localhost:1001/s/all01?能正常返回如上面的截圖數(shù)據(jù);

        ?

        . api返回json數(shù)據(jù)的兩種方式

        ?首先,我們回顧下看下上面節(jié)點(diǎn)例子的截圖,接口響應(yīng)輸出的是xml格式的數(shù)據(jù),這里默認(rèn)采用的是webapi自帶的xml格式化方式,把?Student?屬性全部展示了出來(lái),我們真實(shí)開(kāi)發(fā)接口的時(shí)候,通常會(huì)有些對(duì)象的屬性不會(huì)展示,下面我們通過(guò)增加?DataContract?和?DataMember?來(lái)設(shè)置把不需要暴露的屬性“隱藏掉”,我們先來(lái)看先增加了這兩個(gè)標(biāo)記后的Student實(shí)體:

        1 [DataContract] 2 public class MoStudent 3 { 4 [DataMember] 5 public DateTime Birthday { get; set; } 6 7 [DataMember] 8 public int Id { get; set; } 9 10 [DataMember] 11 public string Name { get; set; } 12 13 [DataMember] 14 public bool Sex { get; set; } 15 16 }

        然后咋們運(yùn)行下程序,在頁(yè)面看到的結(jié)果信息和之前的結(jié)果一模一樣:

        下面把?Birthday?屬性上面的?DataMember?去掉,然后再來(lái)運(yùn)行查看結(jié)果:

        可以看到輸出的結(jié)果中已經(jīng)沒(méi)有了這個(gè)?Birthday?,這里能看出的結(jié)果是如果未標(biāo)記?DataMember?,那么是不會(huì)輸出來(lái)的;我們?cè)賮?lái)看一個(gè)有用的東西,先吧Birthday的DataMember回復(fù),然后修改成如下代碼:

        1 [DataContract] 2 public class MoStudent 3 { 4 [DataMember(Order = 3)] 5 public DateTime Birthday { get; set; } 6 7 [DataMember(Order = 0)] 8 public int Id { get; set; } 9 10 [DataMember(Order = 1)] 11 public string Name { get; set; } 12 13 [DataMember(Order = 2)] 14 public bool Sex { get; set; } 15 16 }

        然后咋們?cè)龠\(yùn)行起來(lái)看效果圖:

        相信仔細(xì)的朋友能夠發(fā)現(xiàn),此時(shí)Birthday數(shù)據(jù)暫時(shí)的位置已經(jīng)從第一個(gè)變到了最后一個(gè),沒(méi)錯(cuò)這就是DataMember中Order屬性參數(shù)的效果:用來(lái)指定顯示輸出數(shù)據(jù)的位置;

        好了咋們來(lái)看正題,webapi返回json數(shù)據(jù)這里講解兩種,一種是使用自帶的Json格式化方式,使用方法只需要在?Global.asax.cs?文件中清除一下默認(rèn)的xml輸出方式即可,代碼如:

        1 var format = GlobalConfiguration.Configuration.Formatters; 2 //清除默認(rèn)xml 3 format.XmlFormatter.SupportedMediaTypes.Clear();

        因?yàn)閣ebapi在啟動(dòng)的時(shí)候,默認(rèn)格式化數(shù)據(jù)有兩種方式xml和json,而xml是其默認(rèn)的啟動(dòng)方式,所以這里是需要清除了xml格式化,那么另外只剩下json,所以咋們?cè)谶\(yùn)行程序后能看到這樣的結(jié)果輸出:

        結(jié)果返回了json數(shù)據(jù),如果咋們想要如上面xml一樣吧Birthday隱藏掉,我們同樣也可以使用?DataContract?和?DataMember?來(lái)做這效果,刪除Birthday對(duì)應(yīng)的?DataMember?標(biāo)記后,咋們能看到這樣的效果:

        同理,我們把Birthday的DataMember還原,然后指定Order屬性值?[DataMember(Order=1)]?,這樣Birthday顯示的位置就變動(dòng)了:

        好了這試第一種json格式化的方式,下面來(lái)看下用使用Json.Net怎么來(lái)格式化,為了避免影響效果,我們把?Global.asax.cs?文件還原,然后重新增加一個(gè)Action方法,代碼如:

        1 [Route("all01_1")] 2 public async Task<HttpResponseMessage> GetAllStudents01_1() 3 { 4 var result = await JsonConvert.SerializeObjectAsync(students); 5 6 return new HttpResponseMessage 7 { 8 Content = new StringContent(result), 9 StatusCode = HttpStatusCode.OK 10 }; 11 }

        這里用到了Json.Net的?JsonConvert.SerializeObjectAsync?方法來(lái)格式化成字符串,然后傳遞給?HttpResponseMessage?,最終輸出的效果和上面一樣,好了咋們也來(lái)看看這種方式怎么來(lái)隱藏不希望接口暴露的屬性,這里我們用?JsonIgnore?標(biāo)記,測(cè)試用例在實(shí)體類(lèi)中修改如:

        1 [JsonIgnore] 2 public DateTime Birthday { get; set; }

        然后運(yùn)行看一下效果:

        我們?cè)賮?lái)看一下怎么來(lái)設(shè)置屬性的排序,可以使用?JsonProperty(Order = 1)?,實(shí)體類(lèi)修改的代碼如下:

        1 public class MoStudent 2 { 3 //[DataMember(Order = 1)] 4 [JsonProperty(Order = 1)] 5 public DateTime Birthday { get; set; } 6 7 //[DataMember(Order = 0)] 8 [JsonProperty(Order = 0)] 9 public int Id { get; set; } 10 11 //[DataMember(Order = 1)] 12 [JsonProperty(Order = 1)] 13 public string Name { get; set; } 14 15 //[DataMember(Order = 2)] 16 [JsonProperty(Order = 2)] 17 public bool Sex { get; set; } 18 19 }

        能得到和DataMember設(shè)置的一樣的結(jié)果:

        ?

        . json時(shí)間格式處理方式

        要說(shuō)時(shí)間格式化,我們通常的生日格式如:yyyy-MM-dd這樣,下面也分別對(duì)剛才上面兩種json化出來(lái)的時(shí)間做格式化;先來(lái)看Json.net,我們先來(lái)定義一個(gè)名稱(chēng)為?SelfDateTimeFormat?的類(lèi)并且繼承?DateTimeConverterBase?類(lèi),然后需要重寫(xiě)?ReadJson和WriteJson?,下面看下這個(gè)類(lèi)的全部方法:

        1 /// <summary> 2 /// 自定義時(shí)間格式化 3 /// </summary> 4 public class SelfDateTimeFormat : DateTimeConverterBase 5 { 6 public IsoDateTimeConverter TimeConvert = null; 7 8 public SelfDateTimeFormat() { 9 10 TimeConvert = new IsoDateTimeConverter 11 { 12 DateTimeFormat = "yyyy-MM-dd" 13 }; 14 } 15 16 public SelfDateTimeFormat(string formatter = "yyyy-MM-dd HH:mm:ss") 17 { 18 19 TimeConvert = new IsoDateTimeConverter 20 { 21 DateTimeFormat = formatter 22 }; 23 } 24 25 public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) 26 { 27 28 return TimeConvert.ReadJson(reader, objectType, existingValue, serializer); 29 } 30 31 public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) 32 { 33 34 TimeConvert.WriteJson(writer, value, serializer); 35 } 36 }

        然后我們需要在實(shí)體類(lèi)的時(shí)間屬性上增加這樣的標(biāo)記:?[JsonConverter(typeof(OverridClass.SelfDateTimeFormat))]?,這里的?SelfDateTimeFormat?就是咋們剛才定義的自定義格式化時(shí)間類(lèi),我們來(lái)看一下輸出的效果數(shù)據(jù):

        好了,咋們?cè)賮?lái)看webapi自帶的json格式化如何定義一個(gè)日期格式的數(shù)據(jù),我們需要在Global.asax.cs中增加如下代碼:

        1 var format = GlobalConfiguration.Configuration.Formatters; 2 format.JsonFormatter.SerializerSettings.DateFormatString = "yyyy.MM.dd";

        沒(méi)錯(cuò),只需要如此簡(jiǎn)單的代碼,即可時(shí)間格式化成:

        ?

        . 讓api接口支持返回json和xml數(shù)據(jù)

        開(kāi)篇第一小節(jié)已經(jīng)有簡(jiǎn)單說(shuō)明webapi有自己的json和xml格式化處理,這里們來(lái)設(shè)置通過(guò)參數(shù)請(qǐng)求返回不同的數(shù)據(jù)格式;首先還是需要在Global中設(shè)置如下代碼:

        1 var format = GlobalConfiguration.Configuration.Formatters; 2 format.JsonFormatter.SerializerSettings.DateFormatString = "yyyy.MM.dd"; 3 4 //清除默認(rèn)xml 5 format.XmlFormatter.SupportedMediaTypes.Clear(); 6 7 //通過(guò)參數(shù)設(shè)置返回格式 8 format.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "json", "application/json")); 9 format.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "xml", "application/xml"));

        這里用到了?QueryStringMapping?類(lèi),并傳遞給他構(gòu)造函數(shù)的參數(shù)?new QueryStringMapping("t", "json", "application/json")?和?new QueryStringMapping("t", "xml", "application/xml")?這樣就分別對(duì)用了json和xml,而前面的“t”表示請(qǐng)求的url地址中參數(shù)名稱(chēng)t,下面我們分別來(lái)測(cè)試下兩種請(qǐng)求的參數(shù),地址分別為:

        ?http://localhost:1001/s/all01?t=xml?

        ?

        ?http://localhost:1001/s/all01?t=json?

        ?

        好了,本篇的內(nèi)容就和大家分享到這里,例子個(gè)人感覺(jué)很接近實(shí)際常用,如果可以希望您點(diǎn)個(gè)贊,謝謝。

        佛珠手串文玩加盟賺錢(qián)就是快

        佛珠手串文玩加盟_賺錢(qián)就是快

        扎西德勒_2016極好的牌子!總部傳授開(kāi)店秘訣 特色文化背景,活佛開(kāi)光加持,快速集聚人氣!

        去看看 智能開(kāi)發(fā)平臺(tái) 智能開(kāi)發(fā)平臺(tái)

        智能開(kāi)發(fā)平臺(tái)

        BS/CS/APP/微信軟件開(kāi)發(fā)平臺(tái) 0代碼編程 一次開(kāi)發(fā),同時(shí)生成BS,CS,APP,微信

        去看看 公司/工商注冊(cè)代理代辦信息

        公司/工商注冊(cè)代理代辦信息

        工商注冊(cè)/代理記賬專(zhuān)業(yè)代辦各類(lèi)注冊(cè)/年檢/ 審批代辦各類(lèi)許可證價(jià)格優(yōu)惠盡在58同城.

        去看看

        轉(zhuǎn)載于:https://www.cnblogs.com/kunlunmountain/p/6392406.html

        總結(jié)

        以上是生活随笔為你收集整理的WebApi接口 - 响应输出xml和json 转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

        如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。