浅谈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;
});
相关推荐
吃喝不愁霸王餐APP开发者1 小时前
使用Mockito与WireMock对美团霸王餐接口进行契约测试与集成验证
java·json
chilavert3182 小时前
技术演进中的开发沉思-268 Ajax:JSON
javascript·ajax·okhttp·json
Cv打怪升级4 小时前
3D-Front数据集 json说明
3d·json
电商API&Tina19 小时前
【电商API接口】关于电商数据采集相关行业
java·python·oracle·django·sqlite·json·php
天远数科20 小时前
Go语言金融风控:天远 全能小微企业报告组合接口的 AES 加密与异构 JSON 解析
大数据·golang·json
盼哥PyAI实验室1 天前
Python 爬虫核心基础:请求与响应机制全解析(从 GET 请求到 JSON 分页实战)
爬虫·python·json
陌颜39112 天前
JSON在线工具:从数据混沌到清晰洞察的智能助手
json
放学-别走2 天前
免费在线 JSON 工具:格式化、校验、美化、压缩,一站式解决
json·json工具·json 格式化·json 校验·json 压缩·json 美化·json 转译
Data_agent2 天前
京东图片搜索商品API,json数据返回
数据库·python·json
一方热衷.2 天前
对图像分割的图片进行缩放的同时调整JSON标签
人工智能·计算机视觉·json