• .Net Core 配置之long类型 前端精度丢失和时间格式设置


    在很多项目中,都采用的前后端分离的方式进行开发,经常遇到后台的long精度的数据到前端丢失不准确,显示效果为long类型(19位)的后几位为000,此时需要对long的字段进行设置,改变默认的返回类型,由long类型改变为string类型。所以需要全局自定义修改long类型的返回类型

    1. using Newtonsoft.Json;
    2. using Newtonsoft.Json.Serialization;
    3. using System;
    4.  
    5. namespace NetCore3WebApiTemplate.Utility
    6. {
    7. public class CustomContractResolver : CamelCasePropertyNamesContractResolver
    8. {
    9. ///// <summary>
    10. ///// 实现首字母小写
    11. ///// </summary>
    12. ///// <param name="propertyName"></param>
    13. ///// <returns></returns>
    14. //protected override string ResolvePropertyName(string propertyName)
    15. //{
    16. // return propertyName.Substring(0, 1).ToLower() + propertyName.Substring(1);
    17. //}
    18.  
    19. /// <summary>
    20. /// 对长整型做处理
    21. /// </summary>
    22. /// <param name="objectType"></param>
    23. /// <returns></returns>
    24. protected override JsonConverter ResolveContractConverter(Type objectType)
    25. {
    26. if (objectType == typeof(long))
    27. {
    28. return new JsonConverterLong();
    29. }
    30. return base.ResolveContractConverter(objectType);
    31. }
    32.  
    33. ///// <summary>
    34. ///// Creates a Newtonsoft.Json.Serialization.JsonProperty for the given System.Reflection.MemberInfo.
    35. ///// </summary>
    36. ///// <param name="type"></param>
    37. ///// <param name="memberSerialization"></param>
    38. ///// <returns></returns>
    39. //protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    40. //{
    41. // return type.GetProperties()
    42. // .Select(p =>
    43. // {
    44. // var jp = base.CreateProperty(p, memberSerialization);
    45. // jp.ValueProvider = new NullToEmptyStringValueProvider(p);
    46. // return jp;
    47. // }).ToList();
    48. //}
    49. }
    50. }

      

    1. using Newtonsoft.Json;
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Text;
    5.  
    6. namespace NetCore3WebApiTemplate.Utility
    7. {
    8. /// <summary>
    9. /// Long类型Json序列化重写
    10. /// 在js中传输会导致精度丢失,故而在序列化时转换成字符类型
    11. /// </summary>
    12. public class JsonConverterLong : JsonConverter
    13. {
    14. /// <summary>
    15. /// 是否可以转换
    16. /// </summary>
    17. /// <param name="objectType"></param>
    18. /// <returns></returns>
    19. public override bool CanConvert(Type objectType)
    20. {
    21. return true;
    22. }
    23.  
    24. /// <summary>
    25. /// 读json
    26. /// </summary>
    27. /// <param name="reader"></param>
    28. /// <param name="objectType"></param>
    29. /// <param name="existingValue"></param>
    30. /// <param name="serializer"></param>
    31. /// <returns></returns>
    32. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    33. {
    34. if ((reader.ValueType == null || reader.ValueType == typeof(long?)) && reader.Value == null)
    35. {
    36. return null;
    37. }
    38. else
    39. {
    40. long.TryParse(reader.Value != null ? reader.Value.ToString() : "", out long value);
    41. return value;
    42. }
    43. }
    44.  
    45. /// <summary>
    46. /// 写json
    47. /// </summary>
    48. /// <param name="writer"></param>
    49. /// <param name="value"></param>
    50. /// <param name="serializer"></param>
    51. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    52. {
    53. if (value == null)
    54. writer.WriteValue(value);
    55. else
    56. writer.WriteValue(value + "");
    57. }
    58. }
    59. }

    在startup的ConfigureServices中设置

    序列化的格式

    1. options.SerializerSettings.ContractResolver = new CustomContractResolver();
    2.  
    3. 时间格式:
    1. options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
    1. 代码如下:
    1. /// <summary>
    2. /// This method gets called by the runtime. Use this method to add services to the container.
    3. /// </summary>
    4. /// <param name="services"></param>
    5. public void ConfigureServices(IServiceCollection services)
    6. {
    7. services.AddControllers(ops =>
    8. {
    9.  
    10. }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
    11. .AddNewtonsoftJson(options =>
    12. {
    13. //设置时间格式
    14. options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
    15. options.SerializerSettings.ContractResolver = new CustomContractResolver();
    16. });
    17. }

      

    注意:

      1. AddNewtonsoftJson 方法需要应用Microsoft.AspNetCore.Mvc.NewtonsoftJson
    1. https://www.shuzhiduo.com/A/q4zVxXex5K/
  • 相关阅读:
    django-搭建BBS关键点总结
    关于django中input标签中file类型以及开路由
    Bzoj1115 石子游戏Kam
    HDU1907 John
    HDU2509 Be the Winner
    洛谷P1082 同余方程
    POJ1065 Area
    Vijos1889 天真的因数分解
    Bzoj2440 完全平方数
    Bzoj2705 Longge的问题
  • 原文地址:https://www.cnblogs.com/chinasoft/p/14805262.html
Copyright © 2020-2023  润新知