在很多项目中,都采用的前后端分离的方式进行开发,经常遇到后台的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

.Net Core 配置之long类型 前端精度丢失和时间格式设置的更多相关文章

  1. Long类型参数传到前端精度丢失的解决方案

        由于公司数据库表的id是利用雪花算法生成的,所以实体类里面定义的数据类型为Long.但是这个数据传到前端时,发生了精度丢失的现象.本文记录了从java后端的角度如何解决这个精度丢失的问题,便于 ...

  2. Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)

    1.前言 对于Long 类型的数据,如果我们在Controller层通过@ResponseBody将返回数据自动转换成json时,不做任何处理,而直接传给前端的话,在Long长度大于17位时会出现精度 ...

  3. springboot中关于Long类型返回前端精度丢失问题处理

    使用了HuTool这个雪花算法后,会出现丢失精度的问题 hutool算法使用地址 对于一些大的业务表,自增主键这里 接口层得注意下是否会产生大数值 设计接口的时候采用String类型. 在项目中,我们 ...

  4. Long类型数据前端精度丢失

    问题描述 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440 相 ...

  5. [ JAVA编程 ] double类型计算精度丢失问题及解决方法

    前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...

  6. 后端Long类型传到前端精度丢失的正确解决方式

    原因:前端js对Long类型支持的精度不够,导致后端使用的Long传到前端丢失精度,比如现在分布式id生成算法"雪花算法"在使用中就会出现问题. 解决方式: 1.后端的Long类型 ...

  7. ASP.Net Core中设置JSON中DateTime类型的格式化(解决时间返回T格式)

    最近项目有个新同事,每个API接口里返回的时间格式中都带T如:[2019-06-06T10:59:51.1860128+08:00],其实这个主要是ASP.Net Core自带时间格式列化时间格式设置 ...

  8. 如何解决前端传来的时间格式与mysql表中时间格式不匹配的查询问题

    前端传过来的时间格式为“2016-07-11 11:13:10”,而数据表中对应字段`add_time`的格式为“2016-7-11”,此时sql不能直接用 "where `add_time ...

  9. 后端将Long类型数据传输到前端出现精度丢失的问题

    当将超过16位的数字传输到前端的时候,就会出现精度丢失的问题,然后我按照网上的几种方法实验的时候,只有一种方法成功了.可能是因为环境等方面的问题. 我这里成功是因为:最后使用的是配置mvc的方式,然后 ...

随机推荐

  1. 力扣题解-面试题22. 链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

  2. .net core kafka 入门实例 一篇看懂

      kafka 相信都有听说过,不管有没有用过,在江湖上可以说是大名鼎鼎,就像天龙八部里的乔峰.国际惯例,先介绍生平事迹   简介 Kafka 是由 Apache软件基金会 开发的一个开源流处理平台, ...

  3. bash leetcode

    拓展:grep 193.  ref: https://blog.csdn.net/yanglingwell/article/details/82343407 Given a text file fil ...

  4. 如何为Form表单的多个提交按钮指定不同的Action地址?

    这是我很久以前看到的一个技巧,但我忘记在哪里了,当时遇到这样的需求,做了笔记,现在整理成文章分享出来,因为我感觉这个小技巧还是挺有用的,这种应用场景也算比较常见,比如一个表单有"保存&quo ...

  5. 彻底理解JavaScript ES6中的import和export

    0.前言 前端工程,在最早的时候是没有模块的概念的.随着前端工程的发展,前端开发也越来越规范化,更像是软件工程了.那么随之而来的,为了解决工程化的问题,就引入了模块的概念.但是在早期,因为ecmasc ...

  6. VNC远程控制,如何使用VNC远程控制来管理公司?

    VNC是功能强大的远程操作软件,可以实现日常的远程连接操作:如果稍加利用,可以实现公司的日常管理:既能够节省自身的时间,还可高效的完成这个功能! 我们可以使用:服务器管理工具来进行相关的操作 一.首先 ...

  7. [Python3]为什么map比for循环快

    实验结论 如果需要在循环结束后获得结果,推荐列表解析: 如果不需要结果,直接使用for循环, 列表解析可以备选; 除了追求代码优雅和特定规定情境,不建议使用map 如果不需要返回结果 这里有三个pro ...

  8. [验证码识别技术] 字符型验证码终结者-CNN+BLSTM+CTC

    验证码识别(少样本,高精度)项目地址:https://github.com/kerlomz/captcha_trainer 1. 前言 本项目适用于Python3.6,GPU>=NVIDIA G ...

  9. Java IO实现文件(及文件夹)的复制 原创代码【精】

    单个文件复制 FileInputStream input=new FileInputStream("C://360//fay.jpg"); FileOutputStream out ...

  10. MySQL 高级—— 锁机制

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.锁的概述 1.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计 ...