C#下Newtonsoft.Json的详细利用教程

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

Newtonsoft.Json 是一个非常流行的 C# JSON 序列化和反序列化库,它可以方便地将 C# 对象转换为 JSON 格式,或者将 JSON 数据解析为 C# 对象。Newtonsoft.Json 被广泛用于处理 JSON 数据,因其简朴、高效且功能强大。
以下是 Newtonsoft.Json 在 C# 中的详细利用教程。
安装 Newtonsoft.Json

在利用 Newtonsoft.Json 之前,你需要安装它。最简朴的方式是通过 NuGet:

  • 打开 Visual Studio。
  • 在解决方案资源管理器中右键点击项目,然后选择“管理 NuGet 包”。
  • 搜索 Newtonsoft.Json,然后点击“安装”。
也可以利用以下命令通过 NuGet 控制台安装:
  1. Install-Package Newtonsoft.Json
复制代码
根本用法

1. 序列化 C# 对象为 JSON

要将 C# 对象转换为 JSON 字符串,可以利用 JsonConvert.SerializeObject() 方法。
  1. using Newtonsoft.Json;
  2. public class Person
  3. {
  4.     public string Name { get; set; }
  5.     public int Age { get; set; }
  6. }
  7. var person = new Person
  8. {
  9.     Name = "John",
  10.     Age = 30
  11. };
  12. string json = JsonConvert.SerializeObject(person);
  13. Console.WriteLine(json);
复制代码
输出:
  1. {"Name":"John","Age":30}
复制代码
2. 反序列化 JSON 为 C# 对象

要将 JSON 字符串转换为 C# 对象,可以利用 JsonConvert.DeserializeObject<T>() 方法。
  1. string json = "{"Name":"John","Age":30}";
  2. Person person = JsonConvert.DeserializeObject<Person>(json);
  3. Console.WriteLine(person.Name);  // 输出:John
  4. Console.WriteLine(person.Age);   // 输出:30
复制代码
高级用法

1. 序列化时格式化 JSON(缩进)

为了提高可读性,可以利用 Formatting.Indented 选项将 JSON 格式化为缩进的样式:
  1. string formattedJson = JsonConvert.SerializeObject(person, Formatting.Indented);
  2. Console.WriteLine(formattedJson);
复制代码
输出:
  1. {
  2.   "Name": "John",
  3.   "Age": 30
  4. }
复制代码
2. 处理复杂对象

Newtonsoft.Json 可以处理复杂的对象,比方包含嵌套对象或集合的对象。
  1. public class Address
  2. {
  3.     public string Street { get; set; }
  4.     public string City { get; set; }
  5. }
  6. public class Person
  7. {
  8.     public string Name { get; set; }
  9.     public int Age { get; set; }
  10.     public Address Address { get; set; }
  11. }
  12. var person = new Person
  13. {
  14.     Name = "John",
  15.     Age = 30,
  16.     Address = new Address { Street = "123 Main St", City = "New York" }
  17. };
  18. string json = JsonConvert.SerializeObject(person, Formatting.Indented);
  19. Console.WriteLine(json);
复制代码
输出:
  1. {
  2.   "Name": "John",
  3.   "Age": 30,
  4.   "Address": {
  5.     "Street": "123 Main St",
  6.     "City": "New York"
  7.   }
  8. }
复制代码
3. 反序列化为动态对象

可以将 JSON 解析为动态对象,答应你在运行时机动地访问 JSON 数据。
  1. string json = "{"Name":"John","Age":30}";
  2. dynamic obj = JsonConvert.DeserializeObject<dynamic>(json);
  3. Console.WriteLine(obj.Name);  // 输出:John
  4. Console.WriteLine(obj.Age);   // 输出:30
复制代码
4. 忽略属性

假如你不希望某些属性被序列化,可以利用 JsonIgnore 特性。
  1. public class Person
  2. {
  3.     public string Name { get; set; }
  4.     [JsonIgnore]
  5.     public int Age { get; set; }
  6. }
  7. var person = new Person
  8. {
  9.     Name = "John",
  10.     Age = 30
  11. };
  12. string json = JsonConvert.SerializeObject(person);
  13. Console.WriteLine(json);  // 输出:{"Name":"John"}
复制代码
5. 更改属性名称

可以利用 JsonProperty 特性为属性指定自定义的 JSON 字段名称。
  1. public class Person
  2. {
  3.     [JsonProperty("full_name")]
  4.     public string Name { get; set; }
  5.     [JsonProperty("years")]
  6.     public int Age { get; set; }
  7. }
  8. var person = new Person
  9. {
  10.     Name = "John",
  11.     Age = 30
  12. };
  13. string json = JsonConvert.SerializeObject(person);
  14. Console.WriteLine(json);  // 输出:{"full_name":"John","years":30}
复制代码
6. 处理枚举

可以自定义枚举的序列化方式,使其输出字符串,而不是数字。
  1. public enum Gender
  2. {
  3.     Male,
  4.     Female
  5. }
  6. public class Person
  7. {
  8.     public string Name { get; set; }
  9.     public Gender Gender { get; set; }
  10. }
  11. var person = new Person
  12. {
  13.     Name = "John",
  14.     Gender = Gender.Male
  15. };
  16. string json = JsonConvert.SerializeObject(person);
  17. Console.WriteLine(json);  // 输出:{"Name":"John","Gender":0}
  18. string jsonWithStringEnum = JsonConvert.SerializeObject(person, new StringEnumConverter());
  19. Console.WriteLine(jsonWithStringEnum);  // 输出:{"Name":"John","Gender":"Male"}
复制代码
配置 JsonSerializerSettings

通过 JsonSerializerSettings,你可以更细粒度地控制 JSON 序列化和反序列化举动。
  1. JsonSerializerSettings settings = new JsonSerializerSettings
  2. {
  3.     NullValueHandling = NullValueHandling.Ignore,
  4.     DefaultValueHandling = DefaultValueHandling.Ignore
  5. };
  6. string json = JsonConvert.SerializeObject(person, settings);
  7. Console.WriteLine(json);
复制代码
处理自定义对象(自定义序列化与反序列化)

你可以通过实现 JsonConverter 自定义对象的序列化和反序列化举动。
  1. public class CustomPersonConverter : JsonConverter<Person>
  2. {
  3.     public override void WriteJson(JsonWriter writer, Person value, JsonSerializer serializer)
  4.     {
  5.         writer.WriteStartObject();
  6.         writer.WritePropertyName("full_name");
  7.         writer.WriteValue(value.Name);
  8.         writer.WriteEndObject();
  9.     }
  10.     public override Person ReadJson(JsonReader reader, Type objectType, Person existingValue, bool hasExistingValue, JsonSerializer serializer)
  11.     {
  12.         JObject jo = JObject.Load(reader);
  13.         return new Person { Name = (string)jo["full_name"] };
  14.     }
  15. }
  16. var person = new Person { Name = "John", Age = 30 };
  17. string customJson = JsonConvert.SerializeObject(person, new CustomPersonConverter());
  18. Console.WriteLine(customJson);  // 输出:{"full_name":"John"}
  19. Person customPerson = JsonConvert.DeserializeObject<Person>(customJson, new CustomPersonConverter());
  20. Console.WriteLine(customPerson.Name);  // 输出:John
复制代码
处理 JSON 数组

你可以将 JSON 数组序列化和反序列化为 C# 集合范例,如 List<T> 或数组。
  1. string jsonArray = "[{"Name":"John","Age":30},{"Name":"Jane","Age":25}]";
  2. List<Person> people = JsonConvert.DeserializeObject<List<Person>>(jsonArray);
  3. foreach (var person in people)
  4. {
  5.     Console.WriteLine($"{person.Name}, {person.Age}");
  6. }
复制代码
总结

Newtonsoft.Json 是 C# 中最常用的 JSON 序列化和反序列化库之一,具有强大的功能和易于利用的 API。它可以或许处理简朴和复杂的对象,支持定制化序列化、反序列化,实用于动态对象以及复杂的数据结构。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表