zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    Verdi 看波形常用快捷操作
    Tensorflow系列——Saver的用法
    Verilog-分频器
    (原创)列主元Gauss消去法的通用程序
    冒泡排序算法
    ADC 与实际电压值的关系
    直流耦合 交流耦合 耦合
    当前不会命中断点,源代码与原始版本不同
    示波器触发
    在头文件#pragma comment(lib,"glaux.lib");编译器提示waring C4081: 应输入“newline“
  • 原文地址:https://www.cnblogs.com/binbinxu/p/13061561.html
Copyright © 2011-2022 走看看