-
本次在使用的使用采用前后端開發,因此在前段已完成UI設計以及按照RAP來完成數據的模擬獲取的情況下,后台返回字段出現了json數據的默認格式化。
-
這就很頭疼了,再讓前端再去改明顯會浪費很多的時間,因此決定解決這個問題。
-
首先上網搜索信息,在網上只查到了asp.net webapi的解決方案,但是也為我大概指明了方向。
這是解決方案的代碼:
public static class WebApiConfig {
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// 取消注釋下面的代碼行可對具有 IQueryable 或 IQueryable<T> 返回類型的操作啟用查詢支持。
// 若要避免處理意外查詢或惡意查詢,請使用 QueryableAttribute 上的驗證設置來驗證傳入查詢。
// 有關詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkId=279712。
//config.EnableQuerySupport();
// 若要在應用程序中禁用跟蹤,請注釋掉或刪除以下代碼行
// 有關詳細信息,請參閱: http://www.asp.net/web-api
config.EnableSystemDiagnosticsTracing();
// 干掉XML序列化器
config.Formatters.Remove(config.Formatters.XmlFormatter);
// 解決json序列化時的循環引用問題
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
// 對 JSON 數據使用混合大小寫。駝峰式,但是是javascript 首字母小寫形式.
//config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// 對 JSON 數據使用混合大小寫。跟屬性名同樣的大小.輸出
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
}
}
- 我們需要做的就是將mvc的序列化裝換器設置成DefaultContractResolver;
那接下來就把從Core中來實現這個問題:
- 首先從mvc來判斷應該在AddMvc方法中進行數據操作,那接下來接續為其按上述步驟設置
-
首先添加一個新的JsonJsonSerializerSettings,將ContractResolver 設置成DefaultContractResolver ,並將生成一個的JsonOutputFormatter格式器來存放
-
為了防止其他的格式器影響結構將所有的格式器,只剩下該格式器來序列化json數據。
-
並將新生成的JsonOutputFormatter插入到第一個。
services.AddMvc(options => { var JsonSerializerSettings = new JsonSerializerSettings(); JsonSerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; JsonSerializerSettings.ContractResolver = new DefaultContractResolver(); var jsonOutputFormatter = new JsonOutputFormatter(JsonSerializerSettings, ArrayPool<char>.Shared); options.OutputFormatters.RemoveType<JsonOutputFormatter>(); options.OutputFormatters.RemoveType<TextOutputFormatter>(); options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>(); options.OutputFormatters.Insert(0, jsonOutputFormatter); });
- 結果返回json數據仍存在問題,這就郁悶了,經過多次測試依舊出現問題。
那就試試另一種方式:
- 在模型類中為模型參數指明JsonProperty參數名試試,看數據是否仍舊會被格式化掉。
[JsonProperty("EntrustId")] public uint EntrustId { get; set; }
- 結果在單一數據指明JsonProperty之后返回字段終於解決了。但是這樣的方式只能是一種替代方案,在本質上仍然未解決問題,於是我決定繼續解決這個問題。
按照第一次的思路來說問題應該沒有問題,但是為什么不能解決問題呢。繼續bing查資料吧。。。 終於找到了明燈:https://q.cnblogs.com/q/85812 額,感覺沒天理了。。。
-
問題出在Asp.Net Core 和 Asp.Net一樣已經為我們集成好了這些配置。
-
我們只需要在services.AddMvc().AddJsonOptions()中設置ContractResolver 即可。代碼非常簡單:
services.AddMvc().AddJsonOptions(options=>{ options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
*這個問題花了很久時間解決,但是感覺很值,特別是看到最后的問題的時候感覺自己豁然開朗的感覺。問題很簡單,但是每一步都花費了自己很多心思。
