.Net Core 配置之long類型 前端精度丟失和時間格式設置

在很多項目中,都採用的前後端分離的方式進行開發,經常遇到後台的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