1.與前端交互時,前端總希望傳過去的json字段名首字母小寫,但是.net規范是首字線大寫
如果就寫了下面的轉換方法
/// <summary> /// Poco類字段名轉換成首字母小寫的字典 /// 用於 MVC 的 new JsonResult(){Data=xxx} 后前端Javascript使用 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static dynamic PocoToFirstCharLowerJsonResultData<T>(this T obj) where T : class { var objJson = obj.ToJson(); var dict = objJson.ToInstance<Dictionary<string, object>>(); return dict.ToDictionary(p => p.Key[0].ToString().ToLower() + p.Key.Substring(1), p => p.Value); } /// <summary> /// 普通類字段名轉換成首字母小寫的字典 /// 用於 MVC 的 new JsonResult(){Data=xxx} 后前端Javascript使用 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static dynamic ToFirstCharLowerJsonResultData<T>(this T obj) where T : class { var objJson = obj.ToJson(); var rx = new Regex(@"""(?<v>(\w)*?)"":", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); var match = rx.Match(objJson); while (match.Success) { var originalKeyName = match.Result("${v}"); var currentKeyName = originalKeyName[0].ToString().ToLower() + originalKeyName.Substring(1); objJson = rx.Replace(objJson, "\"" + currentKeyName + "\":", 1, match.Index); match = match.NextMatch(); } var dict = objJson.ToInstance<Dictionary<string, object>>(); return dict.ToDictionary(p => p.Key[0].ToString().ToLower() + p.Key.Substring(1), p => p.Value); }
2.Controller調用如下
public ActionResult QueryAllModels() { var response = this.Service.QueryModels(); return new JsonResult(){Data=response .ToFirstCharLowerJsonResultData()}; }
3.另一種實現,用 Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver
/// <summary> /// JsonResult,駝峰式轉換 /// </summary> public class LowerCamelJsonResult : ActionResult { /// <summary> /// 目標對象 /// </summary> public object Data { get; set; } /// <summary> /// 構造器 /// </summary> public LowerCamelJsonResult() { } /// <summary> /// 構造器 /// </summary> public LowerCamelJsonResult(object data) { this.Data = data; } /// <summary> /// 重寫執行結果 /// </summary> /// <param name="context"></param> public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); } //json對象命名小駝峰式轉換 var json = JsonConvert.SerializeObject( this.Data, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() } ); context.HttpContext.Response.Write(json); } }
調用方法
public ActionResult QueryAllModels() { var response = this.Service.QueryModels(); return new LowerCamelJsonResult(){Data=response }; }
