Newtonsoft.Json
是一个非常流行的 C# JSON 序列化和反序列化库,它可以方便地将 C# 对象转换为 JSON 格式,或者将 JSON 数据解析为 C# 对象。Newtonsoft.Json
被广泛用于处理 JSON 数据,因其简单、高效且功能强大。
以下是 Newtonsoft.Json
在 C# 中的详细使用教程。
安装 Newtonsoft.Json
在使用 Newtonsoft.Json
之前,你需要安装它。最简单的方式是通过 NuGet:
Newtonsoft.Json
,然后点击“安装”。 也可以使用以下命令通过 NuGet 控制台安装:
Install-Package Newtonsoft.Json
基本用法
1. 序列化 C# 对象为 JSON
要将 C# 对象转换为 JSON 字符串,可以使用 JsonConvert.SerializeObject()
方法。
using Newtonsoft.Json;public class Person{ public string Name { get; set; } public int Age { get; set; }}var person = new Person{ Name = "John", Age = 30};string json = JsonConvert.SerializeObject(person);Console.WriteLine(json);
输出:
{"Name":"John","Age":30}
2. 反序列化 JSON 为 C# 对象
要将 JSON 字符串转换为 C# 对象,可以使用 JsonConvert.DeserializeObject<T>()
方法。
string json = "{\"Name\":\"John\",\"Age\":30}";Person person = JsonConvert.DeserializeObject<Person>(json);Console.WriteLine(person.Name); // 输出:JohnConsole.WriteLine(person.Age); // 输出:30
高级用法
1. 序列化时格式化 JSON(缩进)
为了提高可读性,可以使用 Formatting.Indented
选项将 JSON 格式化为缩进的样式:
string formattedJson = JsonConvert.SerializeObject(person, Formatting.Indented);Console.WriteLine(formattedJson);
输出:
{ "Name": "John", "Age": 30}
2. 处理复杂对象
Newtonsoft.Json
可以处理复杂的对象,例如包含嵌套对象或集合的对象。
public class Address{ public string Street { get; set; } public string City { get; set; }}public class Person{ public string Name { get; set; } public int Age { get; set; } public Address Address { get; set; }}var person = new Person{ Name = "John", Age = 30, Address = new Address { Street = "123 Main St", City = "New York" }};string json = JsonConvert.SerializeObject(person, Formatting.Indented);Console.WriteLine(json);
输出:
{ "Name": "John", "Age": 30, "Address": { "Street": "123 Main St", "City": "New York" }}
3. 反序列化为动态对象
可以将 JSON 解析为动态对象,允许你在运行时灵活地访问 JSON 数据。
string json = "{\"Name\":\"John\",\"Age\":30}";dynamic obj = JsonConvert.DeserializeObject<dynamic>(json);Console.WriteLine(obj.Name); // 输出:JohnConsole.WriteLine(obj.Age); // 输出:30
4. 忽略属性
如果你不希望某些属性被序列化,可以使用 JsonIgnore
特性。
public class Person{ public string Name { get; set; } [JsonIgnore] public int Age { get; set; }}var person = new Person{ Name = "John", Age = 30};string json = JsonConvert.SerializeObject(person);Console.WriteLine(json); // 输出:{"Name":"John"}
5. 更改属性名称
可以使用 JsonProperty
特性为属性指定自定义的 JSON 字段名称。
public class Person{ [JsonProperty("full_name")] public string Name { get; set; } [JsonProperty("years")] public int Age { get; set; }}var person = new Person{ Name = "John", Age = 30};string json = JsonConvert.SerializeObject(person);Console.WriteLine(json); // 输出:{"full_name":"John","years":30}
6. 处理枚举
可以自定义枚举的序列化方式,使其输出字符串,而不是数字。
public enum Gender{ Male, Female}public class Person{ public string Name { get; set; } public Gender Gender { get; set; }}var person = new Person{ Name = "John", Gender = Gender.Male};string json = JsonConvert.SerializeObject(person);Console.WriteLine(json); // 输出:{"Name":"John","Gender":0}string jsonWithStringEnum = JsonConvert.SerializeObject(person, new StringEnumConverter());Console.WriteLine(jsonWithStringEnum); // 输出:{"Name":"John","Gender":"Male"}
配置 JsonSerializerSettings
通过 JsonSerializerSettings
,你可以更细粒度地控制 JSON 序列化和反序列化行为。
JsonSerializerSettings settings = new JsonSerializerSettings{ NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore};string json = JsonConvert.SerializeObject(person, settings);Console.WriteLine(json);
处理自定义对象(自定义序列化与反序列化)
你可以通过实现 JsonConverter
自定义对象的序列化和反序列化行为。
public class CustomPersonConverter : JsonConverter<Person>{ public override void WriteJson(JsonWriter writer, Person value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName("full_name"); writer.WriteValue(value.Name); writer.WriteEndObject(); } public override Person ReadJson(JsonReader reader, Type objectType, Person existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); return new Person { Name = (string)jo["full_name"] }; }}var person = new Person { Name = "John", Age = 30 };string customJson = JsonConvert.SerializeObject(person, new CustomPersonConverter());Console.WriteLine(customJson); // 输出:{"full_name":"John"}Person customPerson = JsonConvert.DeserializeObject<Person>(customJson, new CustomPersonConverter());Console.WriteLine(customPerson.Name); // 输出:John
处理 JSON 数组
你可以将 JSON 数组序列化和反序列化为 C# 集合类型,如 List<T>
或数组。
string jsonArray = "[{\"Name\":\"John\",\"Age\":30},{\"Name\":\"Jane\",\"Age\":25}]";List<Person> people = JsonConvert.DeserializeObject<List<Person>>(jsonArray);foreach (var person in people){ Console.WriteLine($"{person.Name}, {person.Age}");}
总结
Newtonsoft.Json
是 C# 中最常用的 JSON 序列化和反序列化库之一,具有强大的功能和易于使用的 API。它能够处理简单和复杂的对象,支持定制化序列化、反序列化,适用于动态对象以及复杂的数据结构。