“KoobooJson是一款体积小巧没有任何依赖且性能表现强劲的Json工具” 

详细介绍可以参考官方说明,项目地址:https://github.com/Kooboo/Json

ps:楼主目前使用的版本是:asp.net core 2.2

在asp.net core 2.x 中,默认使用的json序列化工具是Newtonsoft.Json

如果你正在使用asp.net core mvc/webapi,并且需要对Json序列化进行一些配置(例如 首字母大小写,日期格式化等),那么你可能在Startup.cs中看到过此方法(AddJsonOptions)的应用:

public void ConfigureServices(IServiceCollection services)
{services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddJsonOptions(opts =>{//忽略循环引用opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;//不使用驼峰样式的keyopts.SerializerSettings.ContractResolver = new DefaultContractResolver();//设置时间格式opts.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";});
}

通过配置以后,返回对象可以被直接序列化成你想要的json格式。

那么,使用KoobooJson的时候,是否也可以像这样直接通过调用某个方法就行使用和配置呢?

看了下官方的说明、请教了作者以后,得知目前还没有为web提供单独的封装好的调用方式。

既然如此,那就自己开撸吧。原理是将Input和Output的格式化方式替换成自己想要的。

废话不多说,上代码:

1.使用nuget添加:Kooboo.Json

2.定义输入的序列化类

public class KoobooInputFormatter : IInputFormatter{protected Kooboo.Json.JsonDeserializeOption Options { get; set; } = new Kooboo.Json.JsonDeserializeOption(){JsonCharacterReadState = Kooboo.Json.JsonCharacterReadStateEnum.IgnoreCase};public KoobooInputFormatter(): this(null){ }public KoobooInputFormatter(Kooboo.Json.JsonDeserializeOption options){Options = options ?? Options;}public bool CanRead(InputFormatterContext context){return true;}public async Task<InputFormatterResult> ReadAsync(InputFormatterContext context){if (context == null){throw new ArgumentNullException(nameof(context));}var request = context.HttpContext.Request;string json;using (var reader = context.ReaderFactory(request.Body, Encoding.UTF8)){json = await reader.ReadToEndAsync();}var result = Kooboo.Json.JsonSerializer.ToObject(json, context.ModelType, Options);return await InputFormatterResult.SuccessAsync(result);}}

3.定义输出的序列化类

public class KoobooOutputFormatter : IOutputFormatter{protected const string CONTENT_TYPE = "application/json";protected virtual Kooboo.Json.JsonSerializerOption Options { get; set; } = new Kooboo.Json.JsonSerializerOption(){DatetimeFormat = Kooboo.Json.DatetimeFormatEnum.ISO8601,IsEnumNum = true,JsonCharacterRead = Kooboo.Json.JsonCharacterReadStateEnum.InitialLower,IsIgnoreValueNull = false,ReferenceLoopHandling = Kooboo.Json.JsonReferenceHandlingEnum.Remove};public KoobooOutputFormatter(): this(null){ }public KoobooOutputFormatter(Kooboo.Json.JsonSerializerOption options){Options = options ?? Options;}public bool CanWriteResult(OutputFormatterCanWriteContext context){return true;}public Task WriteAsync(OutputFormatterWriteContext context){if (context == null){throw new ArgumentNullException(nameof(context));}var response = context.HttpContext.Response;response.ContentType = CONTENT_TYPE;if (context.Object == null){response.Body.WriteByte(192); //192 好像在 Response.Body 中表示 nullreturn Task.CompletedTask;}using (var writer = new StreamWriter(response.Body, Encoding.UTF8)){Kooboo.Json.JsonSerializer.ToJson(context.Object, writer, Options);return Task.CompletedTask;}}}

4.扩展MvcOptions

public static class KoobooMvcOptionsExtension{public static void UseKoobooFormatters(this MvcOptions opts, Action<Kooboo.Json.JsonDeserializeOption, Kooboo.Json.JsonSerializerOption> jsonOptionAction = null){Kooboo.Json.JsonDeserializeOption deserializeOption = null;Kooboo.Json.JsonSerializerOption serializerOption = null;if (jsonOptionAction != null){deserializeOption = new Kooboo.Json.JsonDeserializeOption();serializerOption = new Kooboo.Json.JsonSerializerOption();jsonOptionAction(deserializeOption, serializerOption);}opts.InputFormatters.Clear();opts.InputFormatters.Add(new KoobooInputFormatter(deserializeOption));opts.OutputFormatters.Clear();opts.OutputFormatters.Add(new KoobooOutputFormatter(serializerOption));}}

5.最终使用

public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddMvcOptions(opts =>{opts.UseKoobooFormatters((deserializeOption, serializerOption) =>{//你可以在这里对反序列化/序列化进行配置deserializeOption = null;//反序列化对象设置为null,则使用默认的设置serializerOption.IsEnumNum = false;//枚举不转换为数字serializerOption.IsIgnoreValueNull = true;//忽略值为null的字段serializerOption.JsonCharacterRead = Kooboo.Json.JsonCharacterReadStateEnum.InitialLower;//首字母小写});});}

如果你只需要使用默认的配置。你可以直接这样写:opts.UseKoobooFormatters();

至此,已经可以在项目中使用了,效果如下:

demo下载

百度网盘:

下载地址:https://pan.baidu.com/s/1O-OBn2hYcQFhDXQRc7-Wvg

提取码: a4pw

-----------------------------------------------------------------分割线---------------------------------------------------------------------------

以下是一些常用的特性(忽略字段,仅包含某字段,字段排序等)

    /// <summary>/// IgnoreDefaultValue(忽略此类中所有字段为默认值的元素)/// </summary>[Kooboo.Json.IgnoreDefaultValue]public class StudentModel{/// <summary>/// Alias(字段别名)/// JsonOrder(字段排序)/// </summary>[Kooboo.Json.Alias("Name")][Kooboo.Json.JsonOrder(3)]public string FullName { get; set; }/// <summary>/// IgnoreKey(忽略某字段)/// </summary>[Kooboo.Json.IgnoreKey]public string Address { get; set; }[Kooboo.Json.JsonOrder(2)]public byte Age { get; set; }[Kooboo.Json.JsonOrder(4)]public DateTime Dirthday { get; set; }[Kooboo.Json.JsonOrder(1)]public EnumGender Gender { get; set; }[Kooboo.Json.JsonOrder(5)]public string Mobile { get; set; }/// <summary>/// Base64ValueFormat(这个是自定义的值格式化特性)/// </summary>[Base64ValueFormat]public byte[] Avatar { get; set; }}

如果你需要对值的格式化进行个性设置,例如:你不管,我就需要这种时间格式:ffff.yyyy-MM-dd:HH-mm-ss 或者 上一段代码中类型为byte[]的 Avatar  属性,可以使用:值格式化特性 来实现。

    /// <summary>/// 可以自定义一个值格式化特性/// </summary>public class Base64ValueFormatAttribute : Kooboo.Json.ValueFormatAttribute{public override string WriteValueFormat(object value, Type type, Kooboo.Json.JsonSerializerHandler handler, out bool isValueFormat){isValueFormat = true;if (value == null)return string.Empty;elsereturn Convert.ToBase64String((byte[])value);}public override object ReadValueFormat(string value, Type type, Kooboo.Json.JsonDeserializeHandler handler, out bool isValueFormat){isValueFormat = true;if (string.IsNullOrWhiteSpace(value) || value == "null")return null;elsereturn Convert.FromBase64String(value);}}

如果你想将这个自定义的格式化方式运用于全局,你可以在第5步的UseKoobooFormatters中,通过设置serializerOption.GlobalValueFormat和deserializeOption.GlobalValueFormat来实现

        public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddMvcOptions(opts =>{opts.UseKoobooFormatters((deserializeOption, serializerOption) =>{//你可以在这里对反序列化/序列化进行配置serializerOption.IsEnumNum = true;//枚举转换为数字serializerOption.IsIgnoreValueNull = true;//忽略值为null的字段serializerOption.JsonCharacterRead = Kooboo.Json.JsonCharacterReadStateEnum.InitialLower;//首字母小写serializerOption.GlobalValueFormat = KoobooGlobalValueFormat.Base64Serializer;//设置全局的对于byte[]类型的自定义序列化方式deserializeOption.GlobalValueFormat = KoobooGlobalValueFormat.Base64Deserializer;//设置全局的对于byte[]类型的自定义反序列化方式});});}public static class KoobooGlobalValueFormat{public static string Base64Serializer(object value, Type type, Kooboo.Json.JsonSerializerHandler jsonSerializeHandler, out bool isValueFormat){if (type == typeof(byte[])){isValueFormat = true;if (value == null)return string.Empty;elsereturn Convert.ToBase64String((byte[])value);}else{isValueFormat = false;return null;}}public static object Base64Deserializer(string value, Type type, Kooboo.Json.JsonDeserializeHandler jsonDeserializeHandler, out bool isValueFormat){if (type == typeof(byte[])){isValueFormat = true;if (string.IsNullOrWhiteSpace(value) || value == "null")return null;elsereturn Convert.FromBase64String(value);}else{isValueFormat = false;return null;}}}

值得注意的是,对于byte[]类型的base64解析行为, KoobooJson已经内嵌在配置项中, 只要设置serializerOption.IsByteArrayFormatBase64 = true 即可

public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddMvcOptions(opts =>{opts.UseKoobooFormatters((deserializeOption, serializerOption) =>{//你可以在这里对反序列化/序列化进行配置serializerOption.IsEnumNum = true;//枚举转换为数字serializerOption.IsIgnoreValueNull = true;//忽略值为null的字段serializerOption.JsonCharacterRead = Kooboo.Json.JsonCharacterReadStateEnum.InitialLower;//首字母小写serializerOption.IsByteArrayFormatBase64 = true;//使用KoobooJson自带的对于byte[]类型的base64处理//serializerOption.GlobalValueFormat = KoobooGlobalValueFormat.Base64Serializer;//设置全局的对于byte[]类型的自定义序列化方式//deserializeOption.GlobalValueFormat = KoobooGlobalValueFormat.Base64Deserializer;//设置全局的对于byte[]类型的自定义反序列化方式});});}

参考资料:

1.Asp.Net Core中Json序列化处理整理

2.将 .NET Core 2.0 的默认 JSON 解析器替换为 Jil

KoobooJson在asp.net core中的使用相关推荐

  1. 【C】KoobooJson在asp.net core中的使用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/j_teng/article/detail ...

  2. 如何使用C#在ASP.NET Core中轻松实现QRCoder

    by Yogi 由瑜伽士 如何使用C#在ASP.NET Core中轻松实现QRCoder (How to easily implement QRCoder in ASP.NET Core using ...

  3. asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用

    分享一篇文章,关于asp.net core中httpcontext的拓展. 现在,试图围绕HttpContext.Current构建你的代码真的不是一个好主意,但是我想如果你正在迁移一个企业类型的应用 ...

  4. 在asp.net core中使用托管服务实现后台任务

    在业务场景中经常需要后台服务不停的或定时处理一些任务,这些任务是不需要及时响应请求的. 在 asp.net中会使用windows服务来处理. 在 asp.net core中,可以使用托管服务来实现,托 ...

  5. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  6. 探索ASP.NET Core中的IStartupFilter

    原文:Exploring IStartupFilter in ASP.NET Core 作者:Andrew Lock 译者:Lamond Lu 在本篇博客中,我将介绍一下IStartupFilter, ...

  7. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  8. 在 ASP.NET Core 中集成 Skywalking APM

    前言 大家好,今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking,Skywalking 是 Apache 基金会下面的一个开源 APM 项目,有些同学可能会 APM ...

  9. .ASP NET Core中缓存问题案例

    本篇博客中,我将描述一个关于会话状态(Session State)的问题, 这个问题我已经被询问了好几次了. 问题的场景 创建一个新的ASP.NET Core应用程序 一个用户在会话状态中设置了一个字 ...

最新文章

  1. 用Python分析深圳程序员工资有多高?
  2. python request下载-Python使用requests下载文件问题
  3. 当凡尔赛文学遇上产品经理
  4. 8587520在51CTO【礼树迎蛇 红满社区】
  5. 将Java类作为子进程运行
  6. C++TCP和UDP属于传输层协议
  7. 哈希表(散列表)冲突解决方法
  8. hdu--1073--字符串处理
  9. java实现https请求单向认证、双向认证
  10. 无需开机QQ宠物永久在线刷等级
  11. wpf 客户端 添加qq客服咨询
  12. 最易学和最难学编程语言排行榜!
  13. spfa - 黑暗城堡 - 一本通 3.1 例 1
  14. 二分查找总结——左闭右开区间和左闭右闭区间(C++语言)
  15. 软件测试的各种技术你知道吗?
  16. easyexcel结合zip 导出压缩文件(包含多个excel)
  17. JSD-2204-JDBC-SpringBoot-Day11
  18. 《自律100天,穿越人生盲点》读书笔记
  19. 用python生成个性二维码
  20. 什么是软件服务化(SaaS)

热门文章

  1. android 小米字体大小,Android仿小米巨无霸字体调整控件
  2. 未经安全处理退出使用计算机,将未经安全技术处理的退出使用的涉密计算机、涉密存储设备()或者改作其他用途,属于违反保密法 - 普法考试题库问答...
  3. 财务管理系统(3)项目eclips简单工具类
  4. CentOS7安装ffmpeg
  5. 洛谷P5707 【深基2.例12】上学迟到(c语言)
  6. 【EMC电磁兼容】01.06——标准测试类目之EMS
  7. 常见网络模型——ER随机图、规则图、BA、WS小世界
  8. 华为防火墙配置命令大全!救急!
  9. CPA十六--债务重组的会计处理(转载)
  10. 保障计算机等级考试新闻,计算机等级考试泄密