一、Newtonsoft.Json的介绍
Newtonsoft.Json(也称为 Json.NET)是一个在.NET中广泛使用的开源Json序列化和反序列化库。它以其性能、易用性和功能丰富而著称。与微软的DataContractJsonSerializer和JavaScriptSerializer相比,Newtonsoft.Json在性能上有显著优势,速度大约快50%,比JavaScriptSerializer快250%。除了基本的序列化和反序列化功能外,Newtonsoft.Json还提供了Linq To Json、Json Path、XML支持等高级功能。
二、Newtonsoft.Json 库的安装使用
安装 Newtonsoft.Json
在C#项目中使用Newtonsoft.Json之前,需要先进行安装。可以通过NuGet包管理器进行安装:
1、打开Visual Studio。
2、右键点击项目,选择"管理NuGet包"。
3、搜索"Newtonsoft.Json",然后点击"安装"。 或者,可以通过NuGet控制台安装,使用命令:
bash
Install-Package Newtonsoft.Json
Newtonsoft.Json 的基本用法
序列化 C# 对象为 JSON
使用 JsonConvert.SerializeObject()
方法将C#对象转换为JSON字符串:
cs
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);
输出:
bash
{"Name":"John","Age":30}
反序列化 JSON 为 C# 对象
使用 JsonConvert.DeserializeObject<T>()
方法将JSON字符串转换为C#对象:
cs
string json = "{\"Name\":\"John\",\"Age\":30}";
Person person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person.Name); // 输出:John
Console.WriteLine(person.Age); // 输出:30
高级用法
格式化 JSON(缩进)
为了提高可读性,可以使用 Formatting.Indented
选项将JSON格式化为缩进的样式:
cs
string formattedJson = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(formattedJson);
输出:
bash
{
"Name": "John",
"Age": 30
}
处理复杂对象
Newtonsoft.Json 可以处理复杂的对象,例如包含嵌套对象或集合的对象:
cs
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);
输出:
bash
{
"Name": "John",
"Age": 30,
"Address": {
"Street": "123 Main St",
"City": "New York"
}
}
三、Newtonsoft.Json 库的详细使用
Newtonsoft.Json 高级用法
1. 序列化时格式化 JSON(缩进)
为了提高可读性,可以使用 Formatting.Indented
选项将 JSON 格式化为缩进的样式:
cs
string formattedJson = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(formattedJson);
输出:
bash
{
"Name": "John",
"Age": 30
}
2. 处理复杂对象
Newtonsoft.Json
可以处理复杂的对象,例如包含嵌套对象或集合的对象:
cs
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);
输出:
bash
{
"Name": "John",
"Age": 30,
"Address": {
"Street": "123 Main St",
"City": "New York"
}
}
3. 配置 JsonSerializerSettings
通过 JsonSerializerSettings
,你可以更细粒度地控制 JSON 序列化和反序列化行为:
cs
JsonSerializerSettings settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
DefaultValueHandling = DefaultValueHandling.Ignore
};
string json = JsonConvert.SerializeObject(person, settings);
Console.WriteLine(json);
4. 处理自定义对象(自定义序列化与反序列化)
你可以通过实现 JsonConverter
自定义对象的序列化和反序列化行为:
cs
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
5. 处理 JSON 数组
你可以将 JSON 数组序列化和反序列化为 C# 集合类型,如 List<T>
或数组:
cs
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}");
}
6. 忽略某些属性
使用 [JsonIgnore]
特性忽略不需要序列化的属性:
cs
public class Person
{
public string Name { get; set; }
[JsonIgnore]
public int Age { get; set; }
}
7. 自定义类型转换
自定义 JsonConverter
来转换特定类型的数据,例如将布尔值转换为字符串:
cs
public class BoolConvert : JsonConverter
{
private readonly string[] arrBString;
public BoolConvert(string trueString, string falseString)
{
arrBString = new string[] { trueString, falseString };
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull(); return;
}
bool bValue = (bool)value;
if (bValue)
{
writer.WriteValue(arrBString[0]);
}
else
{
writer.WriteValue(arrBString[1]);
}
}
}
public class Person
{
[JsonConverter(typeof(BoolConvert))]
public bool IsMarry { get; set; }
}
8. 全局序列化设置
设置全局的 JsonSerializerSettings
以应用到所有的序列化操作:
cs
JsonSerializerSettings setting = new JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() => {
setting.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
setting.NullValueHandling = NullValueHandling.Ignore;
setting.Converters.Add(new BoolConvert("是,否"));
return setting;
});