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

server/2024/10/18 2:06:55/

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:

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);

输出:

json">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 被忽略):

json">{"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):

json">{"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 被忽略了):

json">{"UserName": "Alice"
}

http://www.ppmy.cn/server/114844.html

相关文章

SprinBoot+Vue二手回收微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

Python Pandas数据处理利器query方法解析

大家好&#xff0c;在数据分析中&#xff0c;数据过滤是常见且重要的操作。Pandas库提供了多种方法来筛选数据&#xff0c;其中 query 方法因其简洁和强大的表达能力受到广泛欢迎。本文将详细介绍Pandas query 方法的高级应用&#xff0c;助力大家在复杂数据过滤时更加得心应手…

vim 安装与配置教程(详细教程)

vim就是一个功能非常强大的文本编辑器&#xff0c;可以自己DIY的那种 &#xff0c;不但可以写代码 &#xff0c;还可编译 &#xff0c;可以让你手不离键盘的完成鼠标的所有操作。 如果想要了解vim的的发展历史和详细解说&#xff0c;可以自行上网搜索&#xff0c;我主要是记录一…

创建Hive表后,查看表结构发现中文注释乱码

问题描述&#xff1a; 创建Hive表后&#xff0c;查看表结构发现中文注释乱码 解决方法&#xff1a; 进入mysql,执行如下命令 use hive; #修改表字段注解编码 alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8; #修改表注解编码 alter table …

Python 语法糖:让编程更简单(续二)

Python 语法糖&#xff1a;让编程更简单&#xff08;续&#xff09; 10. Type hints Type hints 是 Python 中的一种语法糖&#xff0c;用于指定函数或变量的类型。例如&#xff1a; def greet(name: str) -> None:print(f"Hello, {name}!")这段代码将定义一个…

nova Flip的AI技能点拉满,这些趣味且实用的功能你知道几个?

随着科技的蓬勃发展&#xff0c;人工智能已经渗透到我们日常生活的各个领域&#xff0c;“AIGC”“AI大模型”成为时下的热门词汇。手机作为承接AI革新技术的重要载体&#xff0c;不仅能够大大提升用户的工作效率&#xff0c;也带来了自然、流畅的操作交互体验。 nova Flip…

【mysql】mysql之过滤复制

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

利用R语言进行头条主页内容的自动化下载

对于互联网内容的自动化抓取&#xff0c;R语言提供了强大的工具和库来帮助我们实现这一目标。本文将介绍如何使用R语言进行头条主页内容的自动化下载&#xff0c;包括必要的库安装、代理服务器的配置、HTTP请求的发送、内容的解析和保存。 R语言简介 R语言是一种用于统计计算…