Newtonsoft.Json (Json.NET)使用笔记

news/2024/10/4 20:47:29/文章来源:https://blog.csdn.net/shanbadizun/article/details/141950469

Newtonsoft.Json

  • 简单介绍
    • 许可证
    • 功能特点
  • 代码示例
    • 基本类型的序列化和反序列化
    • 对象与集合的序列化和反序列化
      • 对象的序列化与反序列化
      • 集合的序列化和反序列化
    • 自定义转换器的使用
      • 自定义日期格式
      • 自定义转换器处理特殊类型
    • 动态类型和 LINQ to JSON
      • 使用动态类型解析未知结构的 JSON
      • 使用 JObject 和 JToken
    • 忽略属性、更改属性名称、设置全局序列化选项
      • 忽略某些属性
      • 更改属性名称
      • 设置全局序列化选项

简单介绍

最常用的 JSON 处理库,功能丰富且经过广泛测试,支持复杂的序列化、反序列化、LINQ to JSON 等功能。它是.NET 项目中处理 JSON 的标准工具之一。

许可证

MIT 许可证(开源、免费,可用于商用)。

功能特点

  1. 支持复杂类型、动态类型和匿名类型。
  2. 支持数据验证、格式化、类型转换等。
  3. 支持高性能的流式 JSON 读取和写入。
  4. 提供与 .NET 类库的良好兼容性。

代码示例

基本类型的序列化和反序列化

int number = 100;
string jsonNumber = JsonConvert.SerializeObject(number);
number = JsonConvert.DeserializeObject<int>(jsonNumber);

对象与集合的序列化和反序列化

定义一个简单的类:

public class Product
{public int ProductID { get; set; }public string ProductName { get; set; }public decimal Price { get; set; }
}

对象的序列化与反序列化

Product product = new Product
{ProductID = 1,ProductName = "Laptop",Price = 999.99m
};string json = JsonConvert.SerializeObject(product, Formatting.Indented);
product = JsonConvert.DeserializeObject<Product>(json);

集合的序列化和反序列化

List<Product> products = new List<Product>
{new Product { ProductID = 1, ProductName = "Laptop", Price = 999.99m },new Product { ProductID = 2, ProductName = "Smartphone", Price = 499.99m },new Product { ProductID = 3, ProductName = "Tablet", Price = 299.99m }
};string json = JsonConvert.SerializeObject(products, Formatting.Indented);
products = JsonConvert.DeserializeObject<List<Product>>(json);

自定义转换器的使用

自定义日期格式

假设有一个类,其中包含日期类型:

public class Event
{public string EventName { get; set; }public DateTime EventDate { get; set; }
}

默认情况下,日期会序列化为 ISO 8601 格式。
如果想使用自定义格式,例如 yyyy-MM-dd,可以使用 JsonSerializerSettings。

Event ev = new Event
{EventName = "Conference",EventDate = new DateTime(2023, 10, 1)
};JsonSerializerSettings settings = new JsonSerializerSettings
{DateFormatString = "yyyy-MM-dd"
};string json = JsonConvert.SerializeObject(ev, Formatting.Indented, settings);
ev = JsonConvert.DeserializeObject<Event>(json, settings);

自定义转换器处理特殊类型

假设有一个类,包含 TimeSpan 类型,而默认的序列化可能不满足需求。

public class Task
{public string TaskName { get; set; }public TimeSpan Duration { get; set; }
}

创建自定义转换器:

public class TimeSpanConverter : JsonConverter<TimeSpan>
{public override void WriteJson(JsonWriter writer, TimeSpan value, JsonSerializer serializer){writer.WriteValue(value.ToString());}public override TimeSpan ReadJson(JsonReader reader, Type objectType, TimeSpan existingValue, bool hasExistingValue, JsonSerializer serializer){return TimeSpan.Parse((string)reader.Value);}
}

使用自定义转换器进行序列化和反序列化

Task task = new Task
{TaskName = "Write Code",Duration = new TimeSpan(2, 30, 0) // 2 小时 30 分钟
};JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new TimeSpanConverter());string json = JsonConvert.SerializeObject(task, Formatting.Indented, settings);
task = JsonConvert.DeserializeObject<Task>(json, settings);

动态类型和 LINQ to JSON

使用动态类型解析未知结构的 JSON

当处理的 JSON 结构未知或动态变化时,可以使用 dynamic 类型。

示例 JSON:

{"Name": "Alice","Age": 30,"Skills": ["C#", "WPF", "JSON"]
}

解析动态 JSON:

string json = @"{""Name"": ""Alice"",""Age"": 30,""Skills"": [""C#"", ""WPF"", ""JSON""]
}";dynamic obj = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine($"Name: {obj.Name}");
Console.WriteLine($"Age: {obj.Age}");
Console.WriteLine("Skills:");
foreach (var skill in obj.Skills)
{Console.WriteLine($"- {skill}");
}

使用 JObject 和 JToken

using Newtonsoft.Json.Linq;string json = @"{""Name"": ""Alice"",""Age"": 30,""Skills"": [""C#"", ""WPF"", ""JSON""]
}";JObject obj = JObject.Parse(json);// 读取值
string name = (string)obj["Name"];
int age = (int)obj["Age"];
JArray skills = (JArray)obj["Skills"];// 添加新属性
obj["Country"] = "China";// 删除属性
obj.Property("Age").Remove();// 遍历所有属性
foreach (var property in obj.Properties())
{Console.WriteLine($"{property.Name}: {property.Value}");
}// 输出修改后的 JSON
string modifiedJson = obj.ToString();
Console.WriteLine(modifiedJson);

输出:

Name: Alice
Skills: ["C#","WPF","JSON"]
Country: China
{"Name": "Alice","Skills": ["C#","WPF","JSON"],"Country": "China"
}

忽略属性、更改属性名称、设置全局序列化选项

忽略某些属性

使用 [JsonIgnore] 特性可以在序列化和反序列化时忽略某些属性。

定义一个简单的类:

public class User
{public string UserName { get; set; }[JsonIgnore]public string Password { get; set; }
}

示例:

User user = new User
{UserName = "Alice",Password = "secret"
};string json = JsonConvert.SerializeObject(user, Formatting.Indented);
Console.WriteLine(json);

输出的 JSON(Password 被忽略):

{"UserName": "Alice"
}

更改属性名称

使用 [JsonProperty] 特性可以更改序列化时的属性名称。

定义一个简单的类:

public class User
{[JsonProperty("user_name")]public string UserName { get; set; }public string Email { get; set; }
}

示例:

User user = new User
{UserName = "Alice",Email = "alice@example.com"
};string json = JsonConvert.SerializeObject(user, Formatting.Indented);
Console.WriteLine(json);

输出的 JSON(UserName 被更改为 user_name):

{"user_name": "Alice","Email": "alice@example.com"
}

设置全局序列化选项

可以通过 JsonSerializerSettings 设置全局的序列化和反序列化选项。

定义一个简单的类:

public class User
{public string UserName { get; set; }public string Email { get; set; }
}

示例:忽略空值

User user = new User
{UserName = "Alice",
};JsonSerializerSettings settings = new JsonSerializerSettings
{NullValueHandling = NullValueHandling.Ignore
};string json = JsonConvert.SerializeObject(user, Formatting.Indented, settings);
Console.WriteLine(json);

输出的 JSON(Email 被忽略了):

{"UserName": "Alice"
}

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

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

相关文章

9月12日星期四今日早报简报微语报早读

9月12日星期四&#xff0c;农历八月初十&#xff0c;早报微语早读。 1、今年第13号台风“贝碧嘉”已生成&#xff0c;未来趋向我国东海海面&#xff1b; 2、国台办&#xff1a;若台湾方面批准&#xff0c;金门“踩线团”有望十一假期前成行&#xff1b; 3、河北承德一矿企被…

音视频入门基础:WAV专题(9)——FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

centos上开启mysql远程访问功能

自从mysql8以后&#xff0c;mysql有些命令变了&#xff0c;例如授权需要分成好几行。如果想远程访问mysql&#xff0c;那么可以这样做&#xff1a; mysql -u root -p mysql //先登录mysql create user root% identified by 你自己的密码;//先建立一个root用户和密码 grant a…

OpenGL(四) 纹理贴图

几何模型&材质&纹理 渲染一个物体需要&#xff1a; 几何模型&#xff1a;决定了物体的形状材质&#xff1a;绝对了当灯光照到上面时的作用效果纹理&#xff1a;决定了物体的外观 纹理对象 纹理有2D的&#xff0c;有3D的。2D图像就是一张图片&#xff0c;3D图像是在…

微服务保护学习笔记(四)FeignClient整合Sentinel、线程隔离(舱壁模式)、熔断降级

文章目录 前言3 隔离和降级3.1 FeignClient整合Sentinel3.1.1 搭建SpringCloud项目3.1.2 修改配置文件3.1.3 编写失败降级逻辑 3.2 线程隔离&#xff08;舱壁模式&#xff09;3.2.1 线程隔离的实现方式3.2.2 线程池隔离 3.3 熔断降级3.3.1 熔断降级的实现方式3.3.2 慢调用比例3…

PDB数据库数据查看和下载

RCSB&#xff08;Research Collaboratory for Structural Bioinformatics&#xff09;的PDB&#xff08;Protein Data Bank&#xff09;数据库是一个具有全球性影响力的科学数据库&#xff0c;主要用于存储和分享生物大分子&#xff08;主要是蛋白质、核酸以及部分多糖&#xf…

干耳朵里面有坨屎出不来怎么办?口碑好的可视耳勺

干耳朵不比油耳朵&#xff0c;耳道中的耳屎过多会自己流到外耳道出来方便我们清理。干耳朵里面有坨屎出不来建议使用专业的工具来掏&#xff0c;在挖取过程中会更加精准和安全。但随着可视挖耳勺近几年越来越火爆&#xff0c;各种款式层出不穷&#xff0c;这其中也隐藏了不少劣…

[数据集][目标检测]汽车头部尾部检测数据集VOC+YOLO格式5319张3类别

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 版权单位&#xff1a;未来自主研究中心(FIRC) 版权声明&#xff1a;数据集仅仅供个人使用&#xff0c;不得在未授权情况下挂淘宝、咸鱼等交易网站公开售卖,由此引发的法律责任需自行承担 数据集格式&#xff1a;Pascal VOC格…

构建数字化时代的企业:数据驱动的信息架构战略

信息架构的黄金标准&#xff1a;全球企业转型的权威指南 The Open Group&#xff1a;信息架构领域的权威 全球范围的标准制定者 The Open Group是一家专注于企业架构和技术标准的全球性组织&#xff0c;拥有700多家成员机构&#xff0c;包括世界领先的科技公司、咨询公司和学…

中国书法—孙溟㠭篆刻《消失的心》

中国书法孙溟㠭篆刻作品《消失的心》 从小跟我多年的那颗单纯的心找不到了&#xff0c;那颗遇事激动砰砰跳的心没有了&#xff0c;身上多了一颗不属于我的世俗蒙尘铁打不跳动心&#xff0c;我已修成“正果”。甲辰秋月于寒舍小窗下溟㠭刊。 孙溟㠭篆刻《消失的心》 孙溟㠭…

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享

下载链接在博客最底部&#xff01;&#xff01; 之前需要参考这本书&#xff0c;但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源&#xff0c;浪费了不少时间&#xff0c;在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…

C/C++ 网络编程之关于多核利用问题

在 C/C 网络编程之中&#xff0c;多核利用分为以下几类&#xff1a; 1、一个链接一个线程&#xff0c;即传统且淘汰的 MTA 架构 形式&#xff1a;每次捕获链接&#xff0c;create_new_thread 一个子线程出来处理。 优点&#xff1a;开发简单&#xff0c;维护简单。 缺点&#x…

如何通过食堂采购小程序端降低成本,提升效率?

随着数字化管理工具的普及&#xff0c;越来越多的食堂正在引入小程序来优化采购流程&#xff0c;减少成本和提升效率。食堂采购小程序端通过技术手段实现了自动化、智能化的管理方式&#xff0c;为管理者提供了极大的便利。本文将探讨如何利用技术手段开发一个高效的食堂采购小…

C#基础(11)函数重载

前言 前面我们已经完成了ref和out补充知识点的学习&#xff0c;以及函数参数相关的学习&#xff0c;今天便再次为函数补充一个知识点&#xff1a;函数重载。 函数重载是指在同一个作用域中&#xff0c;可以有多个同名函数&#xff0c;但参数列表不同。它的发展可以追溯到早期…

vue + Element UI table动态合并单元格

一、功能需求 1、根据名称相同的合并工作阶段和主要任务合并这两列&#xff0c;但主要任务内容一样&#xff0c;但要考虑主要任务一样&#xff0c;但工作阶段不一样的情况。&#xff08;枞向合并&#xff09; 2、落实情况里的定量内容和定性内容值一样则合并。&#xff08;横向…

请解释JSP中的九大内置对象及其作用。什么是Java Web中的请求转发和重定向?它们有什么区别?

请解释JSP中的九大内置对象及其作用。 JSP&#xff08;JavaServer Pages&#xff09;中的九大内置对象&#xff08;也称为隐式对象或自动对象&#xff09;是JSP容器为每个页面提供的Java对象&#xff0c;这些对象在JSP页面被转换成Servlet时自动可用&#xff0c;无需显式声明。…

数学建模:控制预测类——时间序列ARIMA模型

目录 1.时间序列ARIMA模型 2.ARIMA模型大纲 3.模型详解 1&#xff09;自回归模型AR(p) 2&#xff09;移动平均模型MA(q) 3&#xff09;自回归移动平均模型ARMA(p,q) 4&#xff09;差分自回归移动平均模型ARIMA(p,d,q) 4.ARIMA模型建模步骤 5.建模步骤名词解释 1&…

解决:Vue 中 debugger 不生效

目录 1&#xff0c;问题2&#xff0c;解决2.1&#xff0c;修改 webpack 配置2.2&#xff0c;修改浏览器设置 1&#xff0c;问题 在 Vue 项目中&#xff0c;可以使用 debugger 在浏览器中开启调试。但有时却不生效。 2&#xff0c;解决 2.1&#xff0c;修改 webpack 配置 通…

onpm报错: Install failed

api 9 安装ohos/pulltorefresh2.0.1报错误 ohpm install ohos/pulltorefresh2.0.1 ohpm INFO: fetching meta info of package ohos/pulltorefresh ohpm WARN: fetch meta info of package ohos/pulltorefresh failed - GET https://registry.npmjs.org/ohos/pulltorefresh 404…

怎么仿同款小程序的开发制作方法介绍

很多老板想要仿小程序系统&#xff0c;就是想要做个和别人界面功能类似的同款小程序系统&#xff0c;咨询瀚林问该怎么开发制作&#xff1f;本次瀚林就为大家介绍一下仿制同款小程序系统的方法。 1、确认功能需求 想要模仿同款小程序系统&#xff0c;那么首先需要找到自己想要…