浅谈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;
});
相关推荐
Jay_帅小伙8 小时前
前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor
前端·编辑器·json
林枫依依1 天前
Unity Newtonsoft遍历json中的键值对
unity·json
橘色的喵2 天前
C++编程: 基于cpp-httplib和nlohmann/json实现简单的HTTP Server
c++·http·json·nlohmann·httplib·cpp-httplib
The shackles2 天前
当 webclient 返回复杂json, 但是我只需要其中几个字段的解决方案
json
AskHarries3 天前
java如何解析和生成yaml文件?
java·后端·json
进击的小白菜3 天前
MySQL|通过JSON_UNQUOTE实现MySQL中JSON数据的干净提取
android·mysql·json
终见曦月3 天前
过滤器与ajax异步
java·json·jquery
ljh5746491194 天前
使用 Python 将excel 生成json
python·json·excel