浅谈C#库之Newtonsoft.Json‌

一、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;
});
相关推荐
爱吃涮毛肚的肥肥(暂时吃不了版)41 分钟前
项目班——0510——JSON网络封装
c++·算法·json
GISer_Jing1 小时前
[前端高频]数组转树、数组扁平化、深拷贝、JSON.stringify&JSON.parse等手撕
前端·javascript·json
小吕学编程12 小时前
Jackson使用详解
java·javascript·数据库·json
双叶83615 小时前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json
电商数据girl1 天前
酒店旅游类数据采集API接口之携程数据获取地方美食品列表 获取地方美餐馆列表 景点评论
java·大数据·开发语言·python·json·旅游
bing_1582 天前
Spring MVC 根据请求头 (如 Accept) 怎么返回 JSON 或 XML 数据?
spring·json·mvc
半路_出家ren2 天前
python处理异常,JSON
python·json·异常处理
傻小胖3 天前
json-server的用法-基于 RESTful API 的本地 mock 服务
后端·json·restful
search73 天前
配置文件介绍xml、json
xml·json
Chandler244 天前
Go语言:json 作用和语法
开发语言·golang·json