這兩天在工作中使用SignalR的WebSocket做數據實時傳遞的功能開發,在后端主動向前端廣播數據以Json傳遞時,前端獲取的Json中對應類的變量名首字母默認傳遞的是大寫。而前端一直獲取到的后台返回給Json中字段均為首字母小寫的駝峰命名法。原因出在什么地方了呢?
調研了一番,發現我們一般Web Api 或者Web MVC中的Controler內的那些JsonResult、ActionResult、IHttpActionResult等返回給前端的數據,都是經過語法限定為采用“駝峰”命名法首字母小寫的方式傳遞的。這里簡述下三種方式:
1)在配置路由的WebApiConfig中添加如下屬性:
// 對 JSON 數據使用混合大小寫。駝峰式,但是是javascript 首字母小寫形式.
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// 對 JSON 數據使用混合大小寫。跟屬性名同樣的大小輸出 <Ps, 可選>
//config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
2)在Global.asax文件的Application_Start或分裝好的WebModeul中添加如下屬性:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters屬性來增加自定義json轉換器.
不過補充下,到目前為止GlobalConfiguration類只能控制WebApi Controller中Action返回值的序列化機制,它不能控制WebApi Controller中Action參數的反序列化機制,更不能控制MVC Controller的Action序列化機制。
3)最后就是我們許多網友采用的附加JsonProperty屬性來加以限制,如下圖所示引用Newtonsoft.Json,給每個屬性限制下就OK了。不過,如果遇到繼承自實體的DTO,則可以選用JsonExtention類中的ToJsonString(true,true)方式轉換對象。
using Newtonsoft.Json; /// <summary> ///商品類。 /// </summary> public class Product { /// <summary> /// 商品Id /// </summary> [JsonProperty("productId")] public string ProductId { set; get; } /// <summary> /// 商品名稱 /// </summary> [JsonProperty("productName")] public string ProductName { set; get; }
}
以上就是最近填坑的歷程。