C#Json.NET教程展示了如何使用NewtonsoftJson.NET库处理JSON数据。
JSON
JSON(JavaScript对象表示法)是一种轻量级数据交换格式。它很容易被人类阅读和编写,并被机器解析和生成。application/json
是JSON的官方互联网媒体类型。JSON文件扩展名为.json
。
NewtonsoftJson.NET是一种流行的.NET高性能JSON框架。
在本文中,我们使用NewtonsoftJson.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} }}"; } }
我们从网络资源中读取一个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 }
在本文中,我们使用NewtonsoftJson.NET
在C#中处理JSON数据。
列出所有C#教程。