C# Newtonsoft Json.NET
最后修改于 2023 年 7 月 5 日
C# Json.NET 教程展示了如何使用 Newtonsoft Json.NET 库处理 JSON 数据。
JSON
JSON (JavaScript 对象表示法) 是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。application/json 是 JSON 的官方 Internet 媒体类型。JSON 文件扩展名是 .json。
Newtonsoft Json.NET 是一个流行的、高性能的 .NET JSON 框架。
在本文中,我们将使用 Newtonsoft Json.NET 库。在标准库中,我们也可以使用 System.Text.Json。
JsonConvert 提供了在 .NET 类型和 JSON 类型之间进行转换的方法。 JsonConvert.SerializeObject 将指定的对象序列化为 JSON 字符串。 JsonConvert.DeserializeObject 将 JSON 反序列化为 .NET 对象。
Json.NET 序列化对象
在下面的示例中,我们将一个对象序列化为 JSON 字符串。
using Newtonsoft.Json;
var p = new Product("Product A", new DateTime(2021, 12, 28),
new string[] { "small" });
var json = JsonConvert.SerializeObject(p);
Console.WriteLine(json);
record Product(string Name, DateTime Created, string[] Sizes);
一个产品记录被转换为 JSON 字符串。
$ dotnet run
{"Name":"Product A","Created":"2021-12-28T00:00:00","Sizes":["small"]}
Json.NET 反序列化为对象
下一个示例将生成的 JSON 字符串反序列化回 .NET 类型。
using Newtonsoft.Json;
var json = @"{""Name"":""Product A"",""Created"":""2021-12-28T00:00:00"",""Sizes"":[""small""]}";
Product? p = JsonConvert.DeserializeObject<Product>(json);
Console.WriteLine(p);
record Product(string Name, DateTime Created, string[] Sizes);
我们将 JSON 字符串转换回记录类型。
Product? p = JsonConvert.DeserializeObject<Product>(json);
在尖括号内,我们指定请求的 .NET 类型。
$ dotnet run
Product { Name = Product A, Created = 12/28/2021 12:00:00 AM, Sizes = System.String[] }
Json.NET 序列化列表
在下一个示例中,我们将序列化一个列表。
using Newtonsoft.Json;
var words = new List<string> { "war", "water", "cup",
"forest", "falcon", "snow", "chair", "book" };
string data = JsonConvert.SerializeObject(words);
Console.WriteLine(data);
var users = new List<User> {
new User("John Doe", "gardener"),
new User("Roger Roe", "driver"),
new User("Lucia Novak", "teacher")
};
string data2 = JsonConvert.SerializeObject(users);
Console.WriteLine(data2);
record User(string Name, string Occupation);
该程序使用 JsonConvert.SerializeObject 将字符串列表和用户对象转换为 JSON 字符串。
$ dotnet run
["war","water","cup","forest","falcon","snow","chair","book"]
[{"Name":"John Doe","Occupation":"gardener"},{"Name":"Roger Roe","Occupation":"driver"},
{"Name":"Lucia Novak","Occupation":"teacher"}]
Json.NET 反序列化列表
下一个示例反序列化列表。
using Newtonsoft.Json;
string json1 = @"[""war"",""water"",""cup"",""forest"",""falcon"",""snow"",""chair"",""book""]";
string json2 = @"[{""Name"":""John Doe"",""Occupation"":""gardener""},{""Name"":""Roger Roe"",""Occupation"":""driver""},
{""Name"":""Lucia Novak"",""Occupation"":""teacher""}]";
List<string>? words = JsonConvert.DeserializeObject<List<string>>(json1);
if (words != null)
{
Console.WriteLine(string.Join(',', words));
}
List<User>? users = JsonConvert.DeserializeObject<List<User>>(json2);
if (users != null)
{
Console.WriteLine(string.Join(',', users));
}
record User(string Name, string Occupation);
该程序将两个 JSON 字符串转换回字符串列表和用户对象列表。
$ dotnet run
war,water,cup,forest,falcon,snow,chair,book
User { Name = John Doe, Occupation = gardener },User { Name = Roger Roe, Occupation = driver },User { Name = Lucia Novak, Occupation = teacher }
Json.NET 格式化输出
以下示例美化 JSON 输出。
using Newtonsoft.Json;
var settings = new JsonSerializerSettings
{
Formatting = Newtonsoft.Json.Formatting.Indented
};
var users = new List<User> {
new User("John Doe", "gardener"),
new User("Roger Roe", "driver"),
new User("Lucia Novak", "teacher")
};
string data = JsonConvert.SerializeObject(users, settings);
Console.WriteLine(data);
record User(string Name, string Occupation);
我们使用 JsonSerializerSettings 来修改 JSON 输出。
var settings = new JsonSerializerSettings
{
Formatting = Newtonsoft.Json.Formatting.Indented
};
我们将 Newtonsoft.Json.Formatting.Indented 设置为更美观的输出。
$ dotnet run
[
{
"Name": "John Doe",
"Occupation": "gardener"
},
{
"Name": "Roger Roe",
"Occupation": "driver"
},
{
"Name": "Lucia Novak",
"Occupation": "teacher"
}
]
Json.NET 从网络读取 JSON 数据
接下来,我们使用 HttpClient 创建一个 GET 请求并处理 JSON 输出。
using Newtonsoft.Json;
using var client = new HttpClient();
var url = "http://webcode.me/users.json";
var res = await client.GetAsync(url);
var json = await res.Content.ReadAsStringAsync();
Users? data = JsonConvert.DeserializeObject<Users>(json);
if (data != null)
{
foreach (var user in data.users)
{
Console.WriteLine(user);
}
}
class Users
{
public List<User> users { get; set; } = new();
}
class User
{
[JsonPropertyAttribute("id")]
public int Id { get; set; }
[JsonPropertyAttribute("first_name")]
public string FirstName { get; set; } = string.Empty;
[JsonPropertyAttribute("last_name")]
public string LastName { get; set; } = string.Empty;
[JsonPropertyAttribute("email")]
public string Email { get; set; } = string.Empty;
public override string ToString()
{
return $"User {{ {Id}| {FirstName} {LastName}| {Email} }}";
}
}
我们从 Web 资源读取 JSON 字符串,并将其转换为对象列表。
var res = await client.GetAsync(url);
我们创建一个 GET 请求到指定的资源。
var json = await res.Content.ReadAsStringAsync();
从响应内容中,我们获取 JSON 字符串。
Users? data = JsonConvert.DeserializeObject<Users>(json);
我们将 JSON 字符串反序列化为用户列表。
[JsonPropertyAttribute("first_name")]
public string FirstName { get; set; } = string.Empty;
JsonPropertyAttribute 指示 JsonSerializer 始终使用指定的名称序列化成员。
$ dotnet run
User { 1| Robert Schwartz| rob23@gmail.com }
User { 2| Lucy Ballmer| lucyb56@gmail.com }
User { 3| Anna Smith| annasmith23@gmail.com }
User { 4| Robert Brown| bobbrown432@yahoo.com }
User { 5| Roger Bacon| rogerbacon12@yahoo.com }
来源
在本文中,我们使用 Newtonsoft Json.NET 在 C# 中处理了 JSON 数据。
作者
列出所有 C# 教程。