這兩天在工作中使用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; }
}
以上就是最近填坑的歷程。
