格式化数据及时东西,紧要看用之采用意况,前天与我们大饱眼福的凡webapi格式化数据,这中间的事例重倘使出口json和xml的格式数据,测试用例很类似实际常用情状;希望我们喜欢,也欲各位多多扫码协助与点赞谢谢:

 

. 自定义一个Action,响应输出集合数据

. api重回json数据的片种植艺术

. json时间格式处理形式

. 让api接口帮助回到json和xml数据

 

上边一步一个脚印的来分享:

. 自定义一个Action,响应输出集合数据

首先,大家新建一个webapi项目,新建好之后我们会找到 Controllers/ValuesController.cs 文件,查看里面有自动生成的有些代码,大家先行不任;然后我们创设一个学生 MoStudent 类,属性代码如:

 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     }

接下来我们以 ValuesController 中初阶化一些集体的数额,代码如:

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         };

重来,大家新创一个 GetAllStudents01() 方法,并出口学生汇聚数据,代码如:

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

其一时候大家转移一下色,然后于浏览器访问下地址为: http://localhost:1001/api/values ,此时碰面指示一个错误音信:

json 1

夫错误消息是拖欠地点以兼容上了零星个api的Action,分别吗 Get()和GetAllStudents01() 两单措施,这种似是而非大家当怎么处理为;一种植可以去除其中一个道;二种情势是在默认路由于安下Action,然后经实际的Controller/Action地址来走访;二种植是经Route改下相应的看行程由于(这种措施前边一篇稿子都出征);这里我们即使动用第二栽,先来窜下 WebApiConfig.cs 文件中默认路由的安排,修改后的部署如:

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

变迁后,我们于浏览器中如此看: http://localhost:1001/api/values/GetAllStudents01 ,GetAllStudents01是针对许要拜访的Action名称,不出意外大家能于浏览器中视如下结果:

json 2

webapi能正常重返数据了,不过地点感觉好增长的规范,不便民我们测试,那么下么大家下及亦然篇著作用到的记号RoutePrefixRoute来改下路由,扩张的代码如:

json 3

下一场大家测试访问下该地址: http://localhost:1001/s/all01 能健康重临如下面的截图数据;

 

. api再次回到json数据的一定量种植艺术

 首先,我们想起下看下方面节点例子的截图,接口响应输出的是xml格式的数,这里默认使用的凡webapi自带的xml格式化情势,把 Student 属性全部彰显了下,我们真正开支接口的当儿,平日会有点对象的性不相会展现,下边我们透过多 DataContract 和 DataMember 来装将非待表露的特性“隐藏掉”,我们事先来拘禁先增了就点儿独记后的Student实体:

 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     }

接下来咋们运行下程序,在页面来看的结果消息以及事先的结果同样型一样:

json 4

脚将 Birthday 属性上边的 DataMember 去丢,然后再来运行查看结果:

json 5

好望输出的结果受早已远非了是 Birthday ,这里可以观察的结果是要非标记 DataMember ,那么是休谋面打败出来的;咱们重来拘禁一个行之事物,先吧Birthday的DataMember回复,然后修改成如下代码:

 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     }

下一场咋们再运行起来看功效图:

json 6

深信不疑仔细的朋友能察觉,此时Birthday数据暂的职位都从第一单易到了最后一个,没错就就是是DataMember中Order属性参数的意义:用来指定显示输出数据的职务;

哼了咋们来拘禁正题,webapi重回json数据这里上课两栽,一栽是下自带的Json格式化格局,使用方法就待以 Global.asax.cs 文件被清除一下默认的xml输出格局即可,代码如:

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

以webapi在开行的时刻,默认格式化数据爆发一定量栽办法xml和json,而xml是该默认的启动形式,所以这边是急需免去了xml格式化,那么此外就剩余json,所以咋们在运作程序后可以看这么的结果输出:

json 7

结果回到了json数据,即使咋们牵挂使而上边xml一样吧Birthday隐藏掉,我们一致也得运用 DataContract 和 DataMember 来开就意义,删除Birthday对应之 DataMember 标记后,咋们能看如此的效劳:

json 8

同理,我们把Birthday的DataMember还原,然后指定Order属性值 [DataMember(Order=1)] ,这样Birthday展现的地方就变更了:

json 9

好了这试第一栽json格式化的方法,下边来拘禁下用使用Json.Net怎么来格式化,为了防止影响效率,大家将 Global.asax.cs 文件还原,然后重新充实一个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 方法来格式化成字符串,然后传递给 HttpResponseMessage ,最后输出的力量以及点一样,好了咋们也来看望那种办法怎么来掩藏不期接口显露的属性,这里大家之所以 JsonIgnore 标记,测试用例在实体类吃修改要:

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

接下来运行看一下功力:

json 10

俺们再次来拘禁一下庸来安属性之排序,可以拔取 JsonProperty(Order = 1) ,实体类修改的代码如下:

 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设置的平等的结果:

json 11

 

. json时间格式处理模式

倘若说日子格式化,大家常见的风水格式如:yyyy-MM-dd这样,上边为分别针对刚地方二种json化出来的时日做格式化;先来拘禁Json.net,我们事先来定义一个号也 SelfDate提姆eFormat 的类似以连续 Date提姆(Tim)eConverterBase 类,然后要重写 ReadJson和WriteJson ,下边看下者仿佛的凡事智:

 1  /// <summary>
 2         /// 自定义时间格式化
 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         }

然后大家需要以实体类的时属性上搭这样的号: [JsonConverter(typeof(OverridClass.SelfDateTimeFormat))] ,这里的 SelfDate提姆(Tim)eFormat 就是咋们刚才定义的自定义格式化时间好像,大家来拘禁一下出口的意义数据:

json 12

哼了,咋们再来拘禁webapi自带的json格式化咋样定义一个日子格式的数量,我们需要在Global.asax.cs中多如下代码:

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

对,只待如此概括的代码,即可时间格式化成:

json 13

 

. 让api接口协理回到json和xml数据

开赛第一略带节都来简要表达webapi有投机的json和xml格式化处理,这里等来装通过参数请求重回不同之数额格式;首先如故需要在Global中装置如下代码:

1  var format = GlobalConfiguration.Configuration.Formatters;
2             format.JsonFormatter.SerializerSettings.DateFormatString = "yyyy.MM.dd";
3 
4             //清除默认xml
5             format.XmlFormatter.SupportedMediaTypes.Clear();
6          
7             //通过参数设置返回格式
8             format.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "json", "application/json"));
9             format.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "xml", "application/xml"));

这边以了 QueryStringMapping 类,并传递让他构造函数的参数 new
QueryStringMapping(“t”,
“json”, “application/json”) 和 new
QueryStringMapping(“t”,
“xml”, “application/xml”) 这样便分别针对由此了json和xml,而眼前的“t”表示要的url地址被参数名称t,上边我们独家来测试下零星种植要的参数,地址分别吗:

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

json 14

 

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

json 15

 

吓了,本篇的情节就与大家大快朵颐到此处,例子个人感觉很相近实际常用,假若可以望您点单赞,谢谢。

相关文章

网站地图xml地图