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

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

“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;	//不使用驼峰样式的key	opts.SerializerSettings.ContractResolver = new DefaultContractResolver();	//设置时间格式	opts.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";	});	
}

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

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

看了下官方的说明还未支持 web , 请教了作者以后,自己撸了个方法吧。原理是将 Input 和 Output 的格式化方式替换成自己想要的。废话不多说,上代码:

1.使用nuget添加:Kooboo.Json

640?wx_fmt=png

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 中表示 null	return 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();

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

640?wx_fmt=png

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;	else	return 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;	else	return 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;	else	return 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;	else	return 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

————————————————

版权声明:本文为CSDN博主「j_teng」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/j_teng/article/details/100924973  


https://github.com/dotnetcore

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单例模式的创建方式

说明&#xff1a; 以下均为线程安全的实现方式。 懒汉、饿汉的非线程安全的意义不大&#xff0c;未实现。 1. 饿汉模式 类初始化时直接创建对象 public class Singleton {private static Singleton singleton new Singleton();//饿汉模式&#xff0c;类初始化时直接创建pub…

P3899 [湖南集训]谈笑风生(线段树合并)

P3899 [湖南集训]谈笑风生 给定一颗以111号节点为根的树&#xff0c;如果a≠ba \neq ba​b&#xff0c;且aaa是bbb的祖先&#xff0c;则aaa比bbb更厉害&#xff0c;如果a≠ba \neq ba​b&#xff0c;且dis(a,b)≤xdis(a, b) \leq xdis(a,b)≤x&#xff0c;xxx为给定的一个…

【DevOps进行时】C/S端界面自动化测试:微软UIAutomation实践

在界面自动化测试领域里存在许多流行的自动化测试工具&#xff0c;例如目前比较受欢迎的开源自动化工具Selenium、Katalon&#xff1b;HP旗下知名的商业软件Unified Functional Testing(更名前叫QTP)&#xff1b;隶属于IBM以数据驱动测试的RTF&#xff08;Rational Functional …

代码编辑器横评:为什么 VS Code 能拔得头筹

2015 年 4 月 29 日的 Build 大会上&#xff0c;微软发布了 Visual Studio Code 第一个预览版本。短短四年时间里&#xff0c;VS Code 高速成长。根据 2019 年 2 月的 PYPL Top IDE index 的排名&#xff0c;VS Code 的涨势迅猛&#xff0c;在所有编辑器与 IDE 中排名第六&…

A. Slackline Adventure(思维 + 莫比乌斯)(2018-2019 ACM-ICPC Brazil Subregional Programming Contest)

A. Slackline Adventure 考虑枚举每个矩形的长跟宽&#xff0c;再统计这个矩形能在坐标轴上出现几次&#xff08;同行相邻同列相邻的单独算&#xff09;&#xff0c;然后有如下式子&#xff1a; 2∑i1n−1∑j1m−1(n−i)(m−j)[gcd⁡(i,j)1][L2≤i2j2≤R2]2 \times \sum_{i 1…

设计模式——结构型模型

一&#xff1a;目录 1. 装饰者模式&#xff08;Decorator&#xff09; 2. 代理模式&#xff08;Proxy&#xff09; 3. 组合模式&#xff08;Composite&#xff09; 4. 桥接模式&#xff08;Bridge&#xff09; 5. 适配器模式&#xff08;Adapter&#xff09; 6. 蝇量模式&#…

D. Best Edge Weight(最小生成树 + 树链剖分)(Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals))

D. Best Edge Weight 给定一个有nnn个点mmm条边的无向连通图&#xff0c;有mmm次询问&#xff0c;每次询问第iii条边的权值最大为多少&#xff0c;这张图的所有最小生成树的方案中&#xff0c;一定包含第iii条边。 先跑一边最小生成树&#xff0c;得到最小生成树&#xff0c;…

利用Helm简化Kubernetes应用部署(1)

目录利用Helm简化Kubernetes应用部署 Helm基础 安装Helm 使用Visual Studio 2019为Helm编写一个简单的应用 利用Helm简化Kubernetes应用部署Helm是Kubernetes生态系统中的一个软件包管理工具&#xff0c;有点类似于Linux操作系统里面的“apt-get”和“yum”。结合上一节内容&am…

设计模式——行为型模式

一&#xff1a;目录 1. 策略模式&#xff08;Strategy&#xff09; 2.状态模式&#xff08;State&#xff09; 3.责任链模式&#xff08;Chain Of Responsibility&#xff09; 4.解释器模式&#xff08;Interpreter&#xff09; 5.命令模式&#xff08;Command&#xff09; 6.观…

2019 ICPC Asia Yinchuan Regional(9 / 13)

2019 ICPC Asia Yinchuan Regional A - Girls Band Party&#xff08;分组背包&#xff09; 每个物品有两个标签&#xff0c;名字&#xff0c;颜色&#xff0c;当名字是设置为奖赏时会对整体加上0.1 的贡献&#xff0c;如果颜色符合要求时 会对整体加上 0.2 的的贡献 但是有…

网络编程——常用协议解析

** 1、网络基础知识 ** 1.1> 什么是OSI模型 OSI 模型(Open System Interconnection model)是一个由国际标准化组织?提出的概念模型,试图?供一个使各种不同的计算机和网络在世界范围内实现互联的标准框架。 它将计算机网络体系结构划分为七层,每层都可以提供抽象良好的…

在 ABP vNext 中编写仓储单元测试的问题一则

一、问题新项目是基于 ABP vNext 框架进行开发的&#xff0c;所以我要求为每层编写单元测试。在同事为某个仓储编写单元测试的时候&#xff0c;发现了一个奇怪的问题。他的对某个聚合根的 A 字段进行了更新&#xff0c;随后对某个导航属性 B 也进行了变更&#xff0c;最后通过仓…

TCP协议——三次握手与四次关闭

1. TCP协议基础 网络编程基础见&#xff0c;传送门 TCP是面向连接的&#xff0c;无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。 在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;连接是通过三次握手进行初始化的。 三次握手…

在 .NET Core 3.0 中实现 JIT 编译的 JSON 序列化,及一些心得与随想

源码&#xff1a;https://github.com/Martin1994/JsonJitSerializerNuGet&#xff1a;https://www.nuget.org/packages/MartinCl2.Text.Json.Serialization/简介&#xff1a;Just-in-time 编译的 JSON 序列化&#xff0c;基于 System.Text.Json.NET Core 3.0 即将正式发布&…

E. Company(Codeforces Round #520 (Div. 2))

E. Company 给定一颗有nnn个节点的树&#xff0c;有mmm次询问&#xff0c;每次询问给定[l,r][l, r][l,r]&#xff0c;我们可以选择删除其中的一个点ppp&#xff0c;然后找到一个深度最深的rtrtrt&#xff0c;使得剩下的点都在rtrtrt的子树上。 考虑对编号为[l,r][l, r][l,r]中…

TCP协议——流量控制和拥塞控制

** 一、流量控制 ** 1.1 什么是流量控制 Sender won’t overflow receiver’s buffer by transmitting too much, too fast. &#xff08;防止发送方发的太快&#xff0c;耗尽接收方的资源&#xff0c;从而使接收方来不及处理&#xff09; 1.2 流量控制的一些知识点 &#x…

征集.NET中国峰会议题

月初做的调查《》&#xff0c;参与人数576人&#xff0c;愿意参与分享.NET Core经验的142人&#xff0c;今天发起分会场主题演讲和闪电演讲议题.2014年微软组织成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.N…

TCP协议——粘包与拆包

TCP的基础 TCP协议基础&#xff0c;传送门 TCP协议流量控制&#xff0c;传送门 1.1 什么是TCP粘包/拆包 TCP是个“流”协议&#xff0c;所谓流&#xff0c;就是没有界限的一串数据。大家可以想想河里的流水&#xff0c;是连成一片的&#xff0c;其间并没有分界线。TCP底层并…

B. Lynyrd Skynyrd(倍增 + 区间最小值)

B. Lynyrd Skynyrd&#xff08;segment tree redouble&#xff09; 给定一个长度为nnn的排列ppp&#xff0c;一个长度为mmm的数组aaa&#xff0c;有mmm次询问&#xff0c;每次询问给定l,rl, rl,r&#xff0c;问在数组aaa中是否存在一个子序列构成的串是ppp的循环位移串&#…

你的通勤时间都去哪了?

大家好&#xff0c;我是Z哥。今天我来唠叨一下。最近无意间看到一份报告&#xff0c;关于我们职场人士上下班通勤时间的。有时候想想也挺无奈的&#xff0c;我们越想去发达一些的城市打拼&#xff0c;反而越被通勤这种琐碎的事情给耽误更多的奋斗时间。但是没办法&#xff0c;在…