Asp.Net Core3.1使用System.Text.Json替换JSON.NET

作者 the7
发布于 2020年02月02日
评论 0
浏览 513

从.Net Core3.0后,微软已内置JSON解析器System.Text.Json,不再依赖 JSON.NETSystem.Text.Json是微软自己搞的,官网介绍说性能高于JSON.NET,也有人做了性能比较测试,具体可参考这篇文章 Try the new System.Text.Json APIs

对于这样一个新东西,该如何使用呢,这里有两个很重要的链接,遇到问题时可翻一翻。

api文档 https://docs.microsoft.com/en-us/dotnet/api/system.text.json?view=netcore-3.1

如何使用 https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to

最后说一下最常见的问题

如何与Asp.Net Core项目集成

如果是新建.NET Core 3.0+的项目,默认已经集成,不用做什么设置。

如何用回 JSON.NET

如果用不惯System.Text.Json,或者你已习惯JSON.NET,那么可以在 startup 中配置。

public void ConfigureServices(IServiceCollection services)
 {
     ...
     services.AddControllers()
             .AddNewtonsoftJson()
     ...
 }

如何序列化

引用 System.Text.Json 命名空间,使用其JsonSerializer进行序列化

var weather = new WeatherForecast
{
  Date = DateTime.Now,
  Summary = "this summary for test",
  TemperatureC = 56
};
var jsonString = System.Text.Json.JsonSerializer.Serialize(weather);

如何不序列化某属性

在属性上加上 [JsonIgnore] 即可。

序列化时排除只读属性

配置IgnoreReadOnlyProperties

var options = new JsonSerializerOptions
{
     IgnoreReadOnlyProperties = true
};
 var jsonString = System.Text.Json.JsonSerializer.Serialize(weather,options);

序列化/反序列化时排除Null属性

配置IgnoreNullValues,此项默认为false。
在序列化时,如配置为true,将直接忽略输出该null值。
在反序列时,如配置为true,对null值将不再处理。

var options = new JsonSerializerOptions
{
    IgnoreNullValues = true
};
var jsonString = System.Text.Json.JsonSerializer.Serialize(weather,options);

序列化时美化结果

配置WriteIndented

var options = new JsonSerializerOptions
{
    WriteIndented = true
};
var jsonString = System.Text.Json.JsonSerializer.Serialize(weather,options);

自定义属性输出名称

在属性上加JsonPropertyName特性

public class WeatherForecastWithPropertyNameAttribute
{
    [JsonPropertyName("Wind")]
    public int WindSpeed { get; set; }
}

反序列时允许注释和逗号

逗号是指数组末尾的逗号,反序列化时遇到注释或逗号,会抛出异常,所以需配置AllowTrailingCommas,此项默认为false。

var options = new JsonSerializerOptions
{
    AllowTrailingCommas = true
};
var jsonString = System.Text.Json.JsonSerializer.Serialize(weather,options);

大小写不敏感

配置 PropertyNameCaseInsensitive。此配置项只用于反序列化,默认为false,意思是默认为敏感的

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
};
var jsonString = System.Text.Json.JsonSerializer.Serialize(weather,options);

WebApi中输出大写

Asp.Net Core WebApi中,默认输出将大写属性名称转为了小写,那如何与属性名称保持一致呢,可在startup中配置

 .AddJsonOptions(options =>
{
    options.JsonSerializerOptions.PropertyNamingPolicy = null;
})

PropertyNamingPolicy,此项有两个可选配置项 JsonNamingPolicy.CamelCasenull,当让也可以自定义一个策略。

0条评论

请先登录后发表评论
提交评论
标签云
css (1) less calc (1) C# (4) C#进制转换 (1) asp.net core (8) Authentication (1) 注销 (1) 登录 (1) 验证 (1) scroll-view (1) 微信小程序 (4) 滚动到底部 (1) StackExchange.Redis (1) google (1) 百度 (1) nginx (2) 大文件 (2) 微信小程序c#解密 (1) 微信小程序获取手机号 (1) openid (1) session_key (1) CDN (1) URL鉴权 (1) 阿里云 (1) async (1) await (1) 禁止下拉上滑效果 (1) Index类型 (1) Range类型 (1) dontent publish (1) dotnet publish在线生成器 (1) System.DrawingCore.GDIPlus报错 (1) centos (1) 中文字体 (1) SqlBulkCopy (1) SqlSugar (1) JWT (5) 认证 (3) RSA JWT (1) 非对称加密 (1) 写信 (1) 见字如面 (1) 优化建议 (2) 正确操作字符串 (1) Java (1) JWT退出 (1) RefreshToken (1) .NET Core网站开发框架 (1) Moz (3) 墨子 (1) JSON.NET (1) Newtonsoft (1) System.Text.Json (1) 自定义后台路径 (1) .netcore (1) quartz (2) 作业调度框架 (1) 作业调度 (1) 定时任务 (1) exception (1) 异常处理 (1) HttpClient (1) IHttpClientFactory (1) RDM (1) Redis (1) Redis Desktop Manager (1) RedisDesktopManager (1) linux (1) mac (1) windows (1) Could not get any response (1) postman (1) leetcode (2) 力扣 (1) 回文字符串 (1) 面试刷题 (1) centos7 (1) php安装 (1) 网易云插件 (1) 马甲App (1) Discuz插件 (1) 网易云音乐 (1) Blazor (1) 五子棋 (1) c#解题 (1) 最长连续序列 (1) Swagger (1) 在线文档 (1) blob (1) mp4 (1) 视频 (1) big file (1) 上传 (1) s (1) Azure (1) Azure Key Vault (1) Configuration (1) 密钥保管库 (1) Dapper安装 (1) Dapper是什么 (1) Dapper连接Mysql (1) Dapper连接SqlServer (1) dapper (1)