.Net Core 配置之long類型 前端精度丟失和時間格式設置
- 2020 年 6 月 7 日
- 筆記
- .Net Core 3.X
在很多項目中,都採用的前後端分離的方式進行開發,經常遇到後台的long精度的數據到前端丟失不準確,顯示效果為long類型(19位)的後幾位為000,此時需要對long的字段進行設置,改變默認的返回類型,由long類型改變為string類型。所以需要全局自定義修改long類型的返回類型
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; namespace NetCore3WebApiTemplate.Utility { public class CustomContractResolver : CamelCasePropertyNamesContractResolver { ///// <summary> ///// 實現首字母小寫 ///// </summary> ///// <param name="propertyName"></param> ///// <returns></returns> //protected override string ResolvePropertyName(string propertyName) //{ // return propertyName.Substring(0, 1).ToLower() + propertyName.Substring(1); //} /// <summary> /// 對長整型做處理 /// </summary> /// <param name="objectType"></param> /// <returns></returns> protected override JsonConverter ResolveContractConverter(Type objectType) { if (objectType == typeof(long)) { return new JsonConverterLong(); } return base.ResolveContractConverter(objectType); } ///// <summary> ///// Creates a Newtonsoft.Json.Serialization.JsonProperty for the given System.Reflection.MemberInfo. ///// </summary> ///// <param name="type"></param> ///// <param name="memberSerialization"></param> ///// <returns></returns> //protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) //{ // return type.GetProperties() // .Select(p => // { // var jp = base.CreateProperty(p, memberSerialization); // jp.ValueProvider = new NullToEmptyStringValueProvider(p); // return jp; // }).ToList(); //} } }
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Text; namespace NetCore3WebApiTemplate.Utility { /// <summary> /// Long類型Json序列化重寫 /// 在js中傳輸會導致精度丟失,故而在序列化時轉換成字符類型 /// </summary> public class JsonConverterLong : JsonConverter { /// <summary> /// 是否可以轉換 /// </summary> /// <param name="objectType"></param> /// <returns></returns> public override bool CanConvert(Type objectType) { return true; } /// <summary> /// 讀json /// </summary> /// <param name="reader"></param> /// <param name="objectType"></param> /// <param name="existingValue"></param> /// <param name="serializer"></param> /// <returns></returns> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if ((reader.ValueType == null || reader.ValueType == typeof(long?)) && reader.Value == null) { return null; } else { long.TryParse(reader.Value != null ? reader.Value.ToString() : "", out long value); return value; } } /// <summary> /// 寫json /// </summary> /// <param name="writer"></param> /// <param name="value"></param> /// <param name="serializer"></param> public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) writer.WriteValue(value); else writer.WriteValue(value + ""); } } }
在startup的ConfigureServices中設置
序列化的格式
options.SerializerSettings.ContractResolver = new CustomContractResolver();
時間格式:
options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
代碼如下:
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services"></param> public void ConfigureServices(IServiceCollection services) { services.AddControllers(ops => { }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0) .AddNewtonsoftJson(options => { //設置時間格式 options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss"; options.SerializerSettings.ContractResolver = new CustomContractResolver(); }); }
注意:
AddNewtonsoftJson 方法需要應用Microsoft.AspNetCore.Mvc.NewtonsoftJson