简介

Newtonsoft.Json是一个在.NET环境下开源的JSON格式序列化和反序列化的类库。它可以将.NET对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为.NET对象。这个类库在.NET开发中被广泛使用,因为它功能强大、易于使用,并且有良好的性能。

使用Newtonsoft.Json,你可以方便地进行以下操作:

  1. 序列化:将.NET对象转换为JSON字符串。这通常用于将数据发送到Web服务或保存到文件。
  2. 反序列化:将JSON字符串转换为.NET对象。这通常用于从Web服务接收数据或从文件中读取数据。
  3. JSON数据的操作:Newtonsoft.Json提供了丰富的API,允许你对JSON数据进行各种操作,如修改、查询、添加和删除等。

要使用Newtonsoft.Json,你首先需要将其添加到你的项目中。你可以通过NuGet包管理器来安装它。一旦安装完成,你就可以在你的代码中使用它。

官网:https://www.newtonsoft.com/json/help/html/Introduction.htm

序列化属性

https://www.newtonsoft.com/json/help/html/SerializationSettings.htm

Converters: 一个包含自定义转换器的集合,这些转换器用于将对象序列化为 JSON 或从 JSON 反序列化为对象。

DateFormatHandling: 控制日期和时间格式的处理方式。例如,可以将日期格式化为特定的字符串格式,或者使用 ISO 8601 格式。

DateTimeZoneHandling: 控制日期时间值的时区处理方式。可以选择本地、UTC 或不处理。

IsoDateTimeFormat: 一个布尔值,用于指示是否将日期时间值格式化为 ISO 8601 格式。

SerializationMemberSelector: 一个委托,允许您自定义哪些属性将被序列化。

ReferenceLoopHandling: 控制循环引用的处理方式。可以选择忽略、警告或抛出异常。

MissingMemberHandling: 控制缺少成员的处理方式。可以选择忽略、抛出异常或引发警告。

DefaultSettings: 使用默认设置进行序列化。这些设置可以覆盖应用程序中的其他特定设置。

ContractResolver: 用于控制 JSON.NET 如何推断和创建 JSON 合同。这允许您自定义命名约定、忽略默认属性等。

NamingStrategy: 用于控制 JSON.NET 中的命名约定。例如,可以使用 CamelCase 或 PascalCase 命名约定。

StringEscapeHandling: 控制字符串转义字符的处理方式。可以选择逃逸或不逃逸转义字符。

ReferenceResolutionPolicy: 控制如何处理重复引用相同的对象。可以选择警告、忽略或抛出异常。

NullValueHandling: 控制如何处理空值。可以选择忽略、表示为 null 或使用默认值。

序列化特性

  • JsonObjectAttribute - 放置在类上以控制如何将它们序列化为 JSON 对象。
  • JsonArrayAttribute - 放置在集合上以控制如何将它们序列化为 JSON 数组。
  • JsonDictionaryAttribute - 放置在字典上以控制如何将它们序列化为 JSON 对象。
  • JsonPropertyAttribute - 放置在字段和属性上,以控制如何将它们序列化为 JSON 对象中的属性。
  • JsonConverterAttribute - 放置在类或字段和属性上,以指定序列化期间应使用哪个 JsonConverter。
  • JsonExtensionDataAttribute - 放置在集合字段或属性上,用于将没有匹配类成员的属性反序列化到指定的集合中,并在序列化期间写入值。
  • JsonConstructorAttribute - 放置在构造函数上以指定应在反序列化期间使用它来创建类。

LINQ To JSON

NQ to JSON 是用于处理 JSON 对象的 API。它在设计时考虑了 LINQ,可以快速查询和创建 JSON 对象。LINQ to JSON 位于 Newtonsoft.Json.Linq 命名空间下。

JObject o = JObject.Parse(@"{
'CPU': 'Intel',
'Drives': [
'DVD read/writer',
'500 gigabyte hard drive'
]
}"); string cpu = (string)o["CPU"];
// Intel string firstDrive = (string)o["Drives"][0];
// DVD read/writer IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();

性能技巧

对比 System.Text.Json

https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/migrate-from-newtonsoft?pivots=dotnet-8-0#table-of-differences

Newtonsoft.Json 功能 System.Text.Json 等效
默认情况下不区分大小写的反序列化 PropertyNameCaseInsensitive 全局设置
Camel 大小写属性名称 PropertyNamingPolicy 全局设置
对属性名称采用蛇形命名法 蛇形命名法命名策略
最小字符转义 严格字符转义,可配置
NullValueHandling.Ignore 全局设置 DefaultIgnoreCondition 全局选项
允许注释 ReadCommentHandling 全局设置
允许尾随逗号 AllowTrailingCommas 全局设置
自定义转换器注册 优先级顺序不同
默认情况下无最大深度 默认最大深度为 64,可配置
PreserveReferencesHandling 全局设置 ReferenceHandling 全局设置
序列化或反序列化带引号的数字 ️ [NumberHandling 全局设置,JsonNumberHandling] 特性
反序列化为不可变类和结构 JsonConstructor,C# 9 记录
支持字段 ️ [IncludeFields 全局设置,JsonInclude] 特性
DefaultValueHandling 全局设置 DefaultIgnoreCondition 全局设置
[JsonProperty] 上的 NullValueHandling 设置 JsonIgnore 特性
[JsonProperty] 上的 DefaultValueHandling 设置 JsonIgnore 特性
反序列化具有非字符串键的 Dictionary 受支持
支持非公共属性资源库和 Getter JsonInclude 特性
[JsonConstructor] 特性 ️ [JsonConstructor] 特性
ReferenceLoopHandling 全局设置 ReferenceHandling 全局设置
回调 回调
NaN、Infinity、-Infinity 受支持
[JsonProperty] 特性上的 Required 设置 ️ [JsonRequired] 特性和 C# 必需的修饰符
DefaultContractResolver 用于忽略属性 DefaultJsonTypeInfoResolver 类
多态序列化 ️ [JsonDerivedType] 特性
多态反序列化 ️ [JsonDerivedType] 特性上的类型鉴别器
反序列化字符串枚举值 反序列化字符串枚举值
MissingMemberHandling 全局设置 处理缺少的成员
在没有资源库的情况下填充属性 在没有资源库的情况下填充属性
ObjectCreationHandling 全局设置 重用而不是替换属性
支持范围广泛的类型
将推断类型反序列化为 object 属性
将 JSON null 文本反序列化为不可为 null 的值类型
DateTimeZoneHandlingDateFormatString 设置
JsonConvert.PopulateObject 方法
支持 System.Runtime.Serialization 特性
JsonObjectAttribute
允许不带引号的属性名称 设计上不受支持
字符串值前后允许单引号 设计上不受支持
对字符串属性允许非字符串 JSON 值 设计上不受支持
TypeNameHandling.All 全局设置 设计上不受支持
支持 JsonPath 查询 不支持
可配置的限制 不支持

封装 JsonHelper 帮助类

    /// <summary>
/// Json序列化反序列化类
/// </summary>
public class JsonHelper
{
private static readonly JsonSerializerSettings _jsonSerializerSettings; static JsonHelper()
{
_jsonSerializerSettings = DefaultSerializerSettings;
} private static JsonSerializerSettings DefaultSerializerSettings
{
get
{
var settings = new JsonSerializerSettings(); // 设置如何将日期写入JSON文本。默认值为“IsoDateFormat”
//settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
// 设置在序列化和反序列化期间如何处理DateTime时区。默认值为 “RoundtripKind”
//settings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
// 设置在序列化和反序列化期间如何处理默认值。默认值为“Include”
//settings.DefaultValueHandling = DefaultValueHandling.Include;
// 设置写入JSON文本时DateTime和DateTimeOffset值的格式,以及读取JSON文本时预期的日期格式。默认值为“ yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK ”。
settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
// 设置在序列化和反序列化期间如何处理空值。默认值为“Include”
//settings.NullValueHandling = NullValueHandling.Include;
// 设置序列化程序在将.net对象序列化为JSON时使用的契约解析器
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// 设置如何处理引用循环(例如,类引用自身)。默认值为“Error”。
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// 是否格式化文本
settings.Formatting = Formatting.Indented;
//支持将Enum 由默认 Number类型 转换为String
//settings.SerializerSettings.Converters.Add(new StringEnumConverter());
//将long类型转为string
settings.SerializerSettings.Converters.Add(new NumberConverter(NumberConverterShip.Int64)); return settings;
}
} public static T Deserialize<T>(string json, JsonSerializerSettings serializerSettings = null)
{
if (string.IsNullOrEmpty(json)) return default; if (serializerSettings == null) serializerSettings = _jsonSerializerSettings; //值类型和String类型
if (typeof(T).IsValueType || typeof(T) == typeof(string))
{
return (T)Convert.ChangeType(json, typeof(T));
} return JsonConvert.DeserializeObject<T>(json, serializerSettings);
} public static string Serialize<T>(T obj, JsonSerializerSettings serializerSettings = null)
{
if (obj is null) return string.Empty;
if (obj is string) return obj.ToString();
if (serializerSettings == null) serializerSettings = _jsonSerializerSettings;
return JsonConvert.SerializeObject(obj, serializerSettings);
}
}

全局配置 Newtonsoft.Json

 public static class JsonSerializeExtensions
{
public static IMvcBuilder AddMCodeJsonOptions(this IMvcBuilder builder, Action<MvcNewtonsoftJsonOptions> configure = null)
{
/* */
builder.AddNewtonsoftJson(options =>
{
// 设置如何将日期写入JSON文本。默认值为“IsoDateFormat”
//options.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
// 设置在序列化和反序列化期间如何处理DateTime时区。默认值为 “RoundtripKind”
//options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
// 设置在序列化和反序列化期间如何处理默认值。默认值为“Include”
//options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Include;
// 设置写入JSON文本时DateTime和DateTimeOffset值的格式,以及读取JSON文本时预期的日期格式。默认值为“ yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK ”。
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
// 设置在序列化和反序列化期间如何处理空值。默认值为“Include”
//options.SerializerSettings.NullValueHandling = NullValueHandling.Include;
// 设置序列化程序在将.net对象序列化为JSON时使用的契约解析器
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// 设置如何处理引用循环(例如,类引用自身)。默认值为“Error”。
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// 是否格式化文本
options.SerializerSettings.Formatting = Formatting.Indented;
//将long类型转为string
options.SerializerSettings.Converters.Add(new NumberConverter(NumberConverterShip.Int64));
configure.Invoke(options);
});
return builder;
}
}

Asp .Net Core 系列:Asp .Net Core 集成 Newtonsoft.Json的更多相关文章

  1. 在Asp.Net Core 3.0中如何使用 Newtonsoft.Json 库序列化数据

    在.Net Core 3.0中 内置了一套Json序列化/反序列化方案,默认可以不再依赖,不再支持   Newtonsoft.Json. 但是.NET Core 3.0 System.Text.Jso ...

  2. [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》

    [ASP.NET MVC2 系列]      [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序>       ...

  3. asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析

    下面我用一个实例来和大家分享一下我的经验,asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析. using Newtonsoft.Json; usin ...

  4. 在 .NET Core 3.0 中支持 Newtonsoft.Json 的使用

    .NET Core 3.0 已经使用了一整套内置的 Josn 序列化/反序列化方案,而且看上去效率还不错.但对于某些项目必须使用到 Newtonsoft.Json 的时候,就会抛出如下异常: Syst ...

  5. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...

  6. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  7. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  8. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

  9. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  10. Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

随机推荐

  1. ActiveReports报表行号

    =RunningValue(Fields!字段名称.Value, CountDistinct, "矩表分组名称") RunningValue(Fields!区域.Value, Co ...

  2. 提高Unity编译dll的速度

    前言 我们有一个Unity纯C#开发的mmo项目(使用ILRuntime热更,开发阶段跑纯C#),在开发到后期之后,每次修改C#代码编译时间在25秒左右,这部分的等待时间是很长的, 我在想有没有办法可 ...

  3. Elasticsearch中的分页查询限制和近似去重统计

    Elasticsearch 前言 深度分页的问题 如何解决 修改默认值 使用search_after方法 scroll 滚动搜索 es中的近似聚合 总结 Elasticsearch 前言 最近工作中用 ...

  4. Linux 统计Web服务日志命令

    本人在Linux运维中收集的一些通用的统计,Apache/Nginx服务器日志的命令组合. Apache日志统计 # 列出当天访问次数最多的IP命令 [root@lyshark.cnblogs.com ...

  5. svg图片引入方式

    第一种直接引入: <svg t="1684280784467" class="icon" viewBox="0 0 1024 1024" ...

  6. LeetCode刷题日记 2020/8/23

    题目描述 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入: [5,7] ...

  7. SpringBoot-MyBatis - Java枚举类型 <---> MySQL Int,建立 类型处理器(typeHandlers)

    场景: MySQL里的某一个字段,比如:status状态,一共有5个状态,我们会在MySQL里 建立 status(int)字段,1.2.3.4.5 来标记5种状态:利用MyBatis在自动代码生成器 ...

  8. MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket

    MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket 一.错误现场还原: 下面我们通过三种方式 ...

  9. 【译】宣布推出适用于 .NET 的 Azure Migrate 应用程序和代码评估工具

    原文 | Olia Gavrysh 翻译 | 郑子铭 我们很高兴地宣布发布一款新工具,可以帮助您将本地 .NET 应用程序迁移到 Azure. 适用于 .NET 的 Azure Migrate 应用程 ...

  10. 初步体验通过 Semantic Kernel 与自己部署的通义千问开源大模型进行对话

    春节之前被 Semantic Kernel 所吸引,开始了解它,学习它. 在写这篇博文之前读了一些英文博文,顺便在这里分享一下: Intro to Semantic Kernel – Part One ...