首页 > 其他分享 >解决雪花Id获取时精度丢失问题

解决雪花Id获取时精度丢失问题

时间:2023-07-19 15:23:31浏览次数:42  
标签:return CustomContractResolver 雪花 value public options 丢失 reader Id

这里拿.Net Core 6 来做演示

在Program.cs中加入如下代码:

builder.Services.AddControllersWithViews().AddNewtonsoftJson(options =>
{
   //循环引用
   options.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore;
   //空值处理
   options.SerializerSettings.NullValueHandling=Newtonsoft.Json.NullValueHandling.Ignore;
   //大小写、处理雪花Id精度丢失
   options.SerializerSettings.ContractResolver = new CustomContractResolver();
   //修改时间的序列化方式
   options.SerializerSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyy/MM/dd HH:mm:ss" });
});

 代码中的CustomContractResolver是单独写了一个帮助类,作用是对长整形数据做处理具体代码如下:

public class CustomContractResolver : DefaultContractResolver
{
      /// <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);
      }
}

自己创建一个名为CustomContractResolver类然后输入上面的代码。

最后在CustomContractResolver.cs中还有一个JsonConverterLong,这也是一个需要单独去创建的一个类需要去做处理代码如下:

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 + "");
        }
    }

 最后就大功告成了赶紧去试试吧!

标签:return,CustomContractResolver,雪花,value,public,options,丢失,reader,Id
From: https://www.cnblogs.com/zkmblog/p/17565669.html

相关文章

  • Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE
    Xcode15beta4(15A5195m)-Apple平台IDEIDEforiOS/iPadOS/macOS/watchOS/tvOS/visonOS请访问原文链接:https://sysin.org/blog/apple-xcode-15/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgvisonOS支持已更新。Xcode15使您能够为所有Apple平台开发......
  • Cisco Identity Services Engine (ISE) 3.3 - 思科身份服务引擎
    CiscoIdentityServicesEngine(ISE)3.3-思科身份服务引擎请访问原文链接:https://sysin.org/blog/cisco-ise-3/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCisco现已发布ISE3.3。思科身份服务引擎(ISE)了解和控制网络上的设备和用户利用整个堆栈中的......
  • BOSHIDA DC电源模块是否有特定的模块尺寸或外壳要求
    BOSHIDADC电源模块是否有特定的模块尺寸或外壳要求BOSHIDADC电源模块广泛应用于各种电子设备中,如计算机、电视、音响、通讯设备,甚至是家用电器等等,因为它们具有高效、可靠、便捷等优点。这些DC电源模块有着不同的尺寸和外壳,以满足不同的应用需求。本文将介绍DC电源模块的尺寸和......
  • android13 如何使用httpcanary抓包
    1.首先下载httpcanary的专业版链接:https://pan.baidu.com/s/1cgneyOGvpNR8pENQ9RFFDQ提取码:ocmb2.将下面的sh文件,放到手机的/data/local/tmp目录,命令为cert.sh并给权限chmod777cert.sh#cert.shset-e#Failonerror#Createaseparatetempdirectory,tohol......
  • android 判断app 通知栏系统开关
    Android判断App通知栏系统开关实现方法1.概述在Android开发中,判断App通知栏系统开关是一个比较常见的需求。本文将介绍一种实现方式,通过使用NotificationManager类和NotificationChannel类来判断App通知栏系统开关是否打开。2.实现步骤下面是整个实现过程的步骤表格:步骤......
  • android 匿名内部类内存泄露
    Android匿名内部类内存泄露在Android开发中,内存泄露是一个常见的问题。当我们在使用匿名内部类时,如果不小心处理不当,也可能导致内存泄露的问题。本文将介绍什么是匿名内部类、为什么会导致内存泄露以及如何避免这些问题。什么是匿名内部类在Java中,内部类是指定义在其他类内部的......
  • android 录音波形
    Android录音波形实现指南1.整体流程为了实现Android录音波形,我们需要完成以下步骤:步骤动作步骤1设置录音权限步骤2初始化录音实例步骤3准备波形绘制步骤4开始录音步骤5读取录音数据步骤6绘制录音波形步骤7结束录音下面我将一步步指导......
  • android 卡片切换动效
    Android卡片切换动效在移动应用程序中,卡片切换动效是一种常见且受欢迎的用户界面设计技术。通过使用动画和过渡效果,卡片切换动效可以为用户提供流畅且吸引人的界面交互体验。本文将介绍如何在Android应用程序中实现卡片切换动效,并给出相应的代码示例。卡片切换动效实现原理卡......
  • android 加载assets 本地json
    Android加载Assets本地JSON的实现作为一名经验丰富的开发者,我很荣幸能够教会你如何在Android应用中加载本地JSON文件。下面我将逐步介绍整个实现过程,并提供相应的代码示例和注释。实现步骤首先,我们来看一下加载Assets本地JSON的实现步骤:步骤说明1获取AssetsManager对......
  • android 获取开机时间
    Android获取开机时间在Android开发中,有时候我们需要获取设备的开机时间。开机时间是指设备自从上次启动以来的时间。Android系统提供了一种简单的方法来获取开机时间,我们可以使用SystemClock类来实现。SystemClock类SystemClock类是Android系统提供的一个工具类,它用于获取设备的......