当前位置: 首页 > news >正文

网站开发的技术意义珠海公司注册

网站开发的技术意义,珠海公司注册,建筑公司信用分查询官网,ps怎么做网站首页和超链接使用 C# 9 的records作为强类型ID - 路由和查询参数在本系列的上一篇文章中使用 C# 9 的records作为强类型ID - 路由和查询参数#xff0c;我们注意到强类型ID的实体#xff0c;序列化为 JSON 的时候报错了#xff0c;就像这样#xff1a;{id: {value我们注意到强类型ID的实体序列化为 JSON 的时候报错了就像这样{id: {value: 1},name: Apple,unitPrice: 0.8 } 不过想了一下这样的意外也是在意料之中的强类型ID是record类型而不是原始类型因此将其序列化为一个对象是有意义的但这显然不是我们想要的……让我们看看如何解决这个问题。System.Text.Json在最新版本的ASP.NET Core从3.0中默认的JSON序列化程序是System.Text.Json因此让我首先介绍这种。为了将强类型的id序列化为其值而不是对象我们需要编写一个通用的 JsonConverterpublic class StronglyTypedIdJsonConverterTStronglyTypedId, TValue : JsonConverterTStronglyTypedIdwhere TStronglyTypedId : StronglyTypedIdTValuewhere TValue : notnull {public override TStronglyTypedId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){if (reader.TokenType is JsonTokenType.Null)return null;var value JsonSerializer.DeserializeTValue(ref reader, options);var factory StronglyTypedIdHelper.GetFactoryTValue(typeToConvert);return (TStronglyTypedId)factory(value);}public override void Write(Utf8JsonWriter writer, TStronglyTypedId value, JsonSerializerOptions options){if (value is null)writer.WriteNullValue();elseJsonSerializer.Serialize(writer, value.Value, options);} } 逻辑很简单对于直接读取 id.value, 对于反序列化创建一个强类型id的实例然后给它赋值。然后在启动类中配置:services.AddControllers().AddJsonOptions(options {options.JsonSerializerOptions.Converters.Add(new StronglyTypedIdJsonConverterProductId, int());}); 现在拿到了想要的结果{id: 1,name: Apple,unitPrice: 0.8 } 真好不过还有有一个问题我们只为添加了一个对于ProductId的转换器但我不想为每种类型的强类型ID添加另一个转换器我们想要一个适用于所有强类型id的转换器……现在可以创建一个转换器工厂(ConverterFactory),就像下边这样public class StronglyTypedIdJsonConverterFactory : JsonConverterFactory {private static readonly ConcurrentDictionaryType, JsonConverter Cache new();public override bool CanConvert(Type typeToConvert){return StronglyTypedIdHelper.IsStronglyTypedId(typeToConvert);}public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options){return Cache.GetOrAdd(typeToConvert, CreateConverter);}private static JsonConverter CreateConverter(Type typeToConvert){if (!StronglyTypedIdHelper.IsStronglyTypedId(typeToConvert, out var valueType))throw new InvalidOperationException($Cannot create converter for {typeToConvert});var type typeof(StronglyTypedIdJsonConverter,).MakeGenericType(typeToConvert, valueType);return (JsonConverter)Activator.CreateInstance(type);} } 首先我们查看需要转换的类型检查它是否实际上是强类型的id然后为该类型创建特定转换器的实例我们添加了一些缓存避免每次都进行反射工作。现在我们没有添加特定的JsonConvert只是添加了一个Factory然后在启动文件修改现在我们的转换器将应用于每个强类型IDservices.AddControllers().AddJsonOptions(options {options.JsonSerializerOptions.Converters.Add(new StronglyTypedIdJsonConverterFactory());}); Newtonsoft.Json如果您的项目使用的是Newtonsoft.Json进行JSON序列化那就很简单了。当它序列化一个值时Newtonsoft.Json 查找一个compatible JsonConverter如果找不到就查找一个TypeConverter, 如果TypeConverter存在并且可以将值转换为string那么它把值序列化为字符串, 因为我们之前定义了 TypeConverterNewtonsoft.Json查找到了我得到以下结果{id: 1,name: Apple,unitPrice: 0.8 } 几乎是正确的……除了id值不应序列化为字符串而应序列化为数字如果id值是GUID或字符串而不是int那就很好则需要编写一个自定义转换器。它和 System.Text.Json 的转换器非常相似不同之处在于Newtonsoft.Json没有转换器工厂ConvertFactory的概念相反我们将编写一个非泛型转换器public class StronglyTypedIdNewtonsoftJsonConverter : JsonConverter {private static readonly ConcurrentDictionaryType, JsonConverter Cache new();public override bool CanConvert(Type objectType){return StronglyTypedIdHelper.IsStronglyTypedId(objectType);}public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){var converter GetConverter(objectType);return converter.ReadJson(reader, objectType, existingValue, serializer);}public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){if (value is null){writer.WriteNull();}else{var converter GetConverter(value.GetType());converter.WriteJson(writer, value, serializer);}}private static JsonConverter GetConverter(Type objectType){return Cache.GetOrAdd(objectType, CreateConverter);}private static JsonConverter CreateConverter(Type objectType){if (!StronglyTypedIdHelper.IsStronglyTypedId(objectType, out var valueType))throw new InvalidOperationException($Cannot create converter for {objectType});var type typeof(StronglyTypedIdNewtonsoftJsonConverter,).MakeGenericType(objectType, valueType);return (JsonConverter)Activator.CreateInstance(type);} }public class StronglyTypedIdNewtonsoftJsonConverterTStronglyTypedId, TValue : JsonConverterTStronglyTypedIdwhere TStronglyTypedId : StronglyTypedIdTValuewhere TValue : notnull {public override TStronglyTypedId ReadJson(JsonReader reader, Type objectType, TStronglyTypedId existingValue, bool hasExistingValue, JsonSerializer serializer){if (reader.TokenType is JsonToken.Null)return null;var value serializer.DeserializeTValue(reader);var factory StronglyTypedIdHelper.GetFactoryTValue(objectType);return (TStronglyTypedId)factory(value);}public override void WriteJson(JsonWriter writer, TStronglyTypedId value, JsonSerializer serializer){if (value is null)writer.WriteNull();elsewriter.WriteValue(value.Value);} } 然后在启动文件中这样设置services.AddControllers().AddNewtonsoftJson(options {options.SerializerSettings.Converters.Add(new StronglyTypedIdNewtonsoftJsonConverter());}); 然后我们得到了预期的结果输出的结果是这样{id: 1,name: Apple,unitPrice: 0.8 } 原文作者: thomas levesque 原文链接https://thomaslevesque.com/2020/12/07/csharp-9-records-as-strongly-typed-ids-part-3-json-serialization/最后欢迎扫码关注我们的公众号 【全球技术精选】专注国外优秀博客的翻译和开源项目分享也可以添加QQ群 897216102
http://www.pierceye.com/news/306839/

相关文章:

  • 精品网站导航 做最好的导航网站建设数据库选择
  • 蓝杉网站建设公司贵阳网站建设公司排名
  • 苏州专业高端网站建设机构建网站公司下载快手
  • 中堂仿做网站个人网站设计论文道客巴巴
  • 怎么用ps做网站效果图24什么网站建设
  • 网站开发技术有网站建设方案 pdf
  • 网站建设教程浩森宇特福州医院网站建设公司
  • 怎样在网站上做超链接网站商城是用什么框架做的
  • 网站建设增城wordpress新文章类型
  • 广州市招投标中心官网上海网站关键词优化
  • 很多网站开发没有框架如何制作的长沙旅游景点大全排名
  • 云南网站推广的目的做动画的网站有哪些
  • 网站建设公司在哪里找资源模拟建设网站
  • 如何盗用网站模板哈尔滨公告
  • 管理咨询网站焦作专业做网站公司哪家好
  • 在国内做跨境电商怎么上外国网站网站不收录
  • 网站介绍ppt怎么做屏蔽网站ip
  • it公论 是建立在什么网站wordpress搬迁数据库连接失败
  • 南县建设局网站营销型网站开发流程包括
  • 有关应用网站申请免费网站空间
  • 二手书交易网站开发现状营销型网站建设推荐乐云seo
  • 山西网站建设怎么样seo优化网站多少钱
  • 网站建设设计模板磁力链最佳的搜索引擎
  • 单位外部网站建设价格哪些网站可以做视频直播
  • 广州黄埔网站建设公司国外做调灵风暴的网站
  • 珠海附近交友平台软件广州网站优化推广方案
  • cgi做网站如何将网站加入百度图 推广
  • 小贷做网站深圳手机app软件开发
  • 上海平台网站建设费用页面模板不存在怎么办
  • 西安网站排名公司上海工商网查询官网