简介

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. Gin 框架之用户密码加密

    目录 一.引入 二.密码加密位置 三.如何加密 四.bcrypt 库加密 4.1 介绍 4.2 优点: 4.3 使用 五.小黄书密码加密实践 一.引入 Gin是一个用Go语言编写的Web框架,而用户密 ...

  2. String 中的Trim

    Trim 切除首尾指定字符 var newStr=""; char[] trimChars={'@','#','$',' '}; string strC="@Hello# ...

  3. gym中的discrete类、box类和multidiscrete类简介和使用

    相关文章: Box() dict()可用于创建连续的空间:OpenAI Gym Discrete和Box spaces同时存在,代码该怎么写:gym中各种离散连续写法 解读gym中的action_sp ...

  4. 5.12 汇编语言:仿写While循环语句

    循环语句(While)一种基本控制结构,它允许程序在条件为真的情况下重复执行一段代码块,直到条件为假为止.循环语句在处理需要重复执行的任务时非常有用,它可以让程序更加高效地处理大量数据或者重复性操作. ...

  5. Axure谷歌浏览器扩展程序下载及安装方法(免FQ)

    在用Axure在chrome查看原型时,没有安装Axure谷歌浏览器插件时无法显示会有提示信息,如果未FQ按照提示是无法直接安装扩展程序的,这里提供插件下载地址并教大家如何安装插件. 平时在使用谷歌浏 ...

  6. DevToys(开发工具) v1.0.2.1

    从事开发工作的朋友们千万不要错过了!今天为大家带来的这款软件可以说是开发人员的必备工具,它就是DevToys软件!DevToys中包含了许多强大实用的开发工具,能够帮助用户将程序开发变得更加简单大大降 ...

  7. list集合去重_谈谈Java中Set集合去重的原理

    导读:Java中Set接口是Collectio的子接口,Set集合不允许包含相同的元素.如果添加相同的元素, add()会返回FALSE, 新元素不会加入.Set集合常用于元素为数字.字符串去重等,但 ...

  8. Hadoop-Operation category READ is not supported in state standby 故障解决

    在查询hdfs时或者执行程序向hdfs写入数据时遇到报错:Operation category READ is not supported in state standby 意思是:该主机状态为待机, ...

  9. AI抠图神器RMBG下载介绍

    RMBG是一款先进的AI抠图工具,和其它同类型软件不同的是,RMBG不需要人工勾勒图形轮廓,可以自动识别图像的前景并去除背景,节省大量时间,效果非常惊艳 最新中文版下载: 百度网盘:https://p ...

  10. axios.delete传参,400错误

    我在使用axios.delete进行传参的时候,发现会报400错误 后端代码(C#) 前端代码 这样的参数请求会报400错误 后端就一个参数,前端发一个id为什么接受不到呢? 在网上找了半天,终于明白 ...