简介

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. 【JS 逆向百例】浏览器插件 Hook 实战,亚航加密参数分析

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  2. TortoiseGit 合并分支方法

    1.首先当前分支 "提交" 并 "推送" 到服务器上,比如开发分支 dev 合并到 master 上 2.右键 > "切换分支" 到要 ...

  3. 基于.net Core+EF Core项目的搭建(一)

    在我们要使用EF的项目中引用两个包Microsoft.EntityFrameworkCore.SqlServer和Microsoft.EntityFrameworkCore.Tools 我把要使用的E ...

  4. 2.3 Windows驱动开发:内核字符串转换方法

    在内核编程中字符串有两种格式ANSI_STRING与UNICODE_STRING,这两种格式是微软推出的安全版本的字符串结构体,也是微软推荐使用的格式,通常情况下ANSI_STRING代表的类型是ch ...

  5. C/C++ Npcap包实现ARP欺骗

    npcap 是Nmap自带的一个数据包处理工具,Nmap底层就是使用这个包进行收发包的,该库,是可以进行二次开发的,不过使用C语言开发费劲,在进行渗透任务时,还是使用Python构建数据包高效,唯一的 ...

  6. C/C++ 关于继承与多态笔记

    继承的基本语法: 继承的目的就是用于提高代码的可用性,减少代码的重复内容,高效开发. #include <iostream> using namespace std; class Base ...

  7. Linux的守护进程 [补档-2023-08-10]

    12-1守护进程 12-1-1介绍 ​   Daemom是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或者事件.这些进 程一般不直接和用户交互,不受用户的登录,注销等影响.没 ...

  8. 还没发布就来了?iPhone 15系列机型价格配置图曝光

    明天凌晨1点,iPhone 15系列就将正式发布,不过在发布前夕,有网友根据此前的各种爆料,制作了一张有关新iPhone的各型号价格和配置的图片,虽然这并不是官方公布的图片,但是也或多或少包含了人们对 ...

  9. opcache导致的RCE复现

    前言 RCE得搭配着文件上传的点来进行利用 环境搭建 用docker搭个php7的环境,作者用的php7.0 docker run -itd --name php7 -p 8083:80 php:7. ...

  10. 【题解】U405180 计算平方和

    \(\bold{Part\ 0}\) 目录 \(/\ \bold{Contents}\) \(\bold{Part\ 1}\) 题目大意 \(/\ \bold{Item\ content}\) \(\ ...