C#下Newtonsoft.Json的详细使用教程

Newtonsoft.Json 是一个非常流行的 C# JSON 序列化和反序列化库,它可以方便地将 C# 对象转换为 JSON 格式,或者将 JSON 数据解析为 C# 对象。Newtonsoft.Json 被广泛用于处理 JSON 数据,因其简单、高效且功能强大。

以下是 Newtonsoft.Json 在 C# 中的详细使用教程。

安装 Newtonsoft.Json

在使用 Newtonsoft.Json 之前,你需要安装它。最简单的方式是通过 NuGet:

  1. 打开 Visual Studio。
  2. 在解决方案资源管理器中右键点击项目,然后选择“管理 NuGet 包”。
  3. 搜索 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);  // 输出:John
Console.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);  // 输出:John
Console.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。它能够处理简单和复杂的对象,支持定制化序列化、反序列化,适用于动态对象以及复杂的数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生命不息-学无止境

你的每一份支持都是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值