如何在C中实现Json反序列化?
- 行业动态
- 2025-01-27
- 2532
在C#中,实现Json反序列化的方法有多种。常见的是使用Newtonsoft.Json库中的JsonConvert.DeserializeObject方法,将JSON字符串转换为相应的对象。System.Text.Json命名空间下的JsonSerializer.Deserialize方法也能实现类似功能。
在C#中,Json反序列化是将JSON格式的字符串转换为相应的C#对象的过程,以下是几种常见的实现方法:
使用Newtonsoft.Json库
安装:通过NuGet包管理器安装Newtonsoft.Json库,在Visual Studio中可以使用以下命令安装:Install-Package Newtonsoft.Json。
简单类型反序列化:对于基本数据类型和简单的自定义类型,可以直接使用JsonConvert.DeserializeObject方法进行反序列化,有一个表示人的简单类Person,包含Name和Age两个属性,以及一个JSON字符串jsonString表示一个人的信息,代码如下:
using Newtonsoft.Json; public class Person { public string Name { get; set; } public int Age { get; set; } } string jsonString = "{\"Name\":\"Tom\", \"Age\":25}"; Person person = JsonConvert.DeserializeObject<Person>(jsonString); Console.WriteLine(person.Name); //输出Tom Console.WriteLine(person.Age); //输出25
复杂类型反序列化:当处理复杂的对象结构,如包含列表、字典等嵌套对象时,同样可以使用JsonConvert.DeserializeObject方法,有一个表示学生的类Student,其中包含一个成绩列表Grades,代码如下:
using System.Collections.Generic; using Newtonsoft.Json; public class Student { public string Name { get; set; } public List<int> Grades { get; set; } } string studentJson = "{\"Name\":\"Jerry\", \"Grades\":[80, 90, 85]}"; Student student = JsonConvert.DeserializeObject<Student>(studentJson); Console.WriteLine(student.Name); //输出Jerry foreach (var grade in student.Grades) { Console.WriteLine(grade); //依次输出80, 90, 85 }
使用System.Text.Json库(.NET Core 3.0及更高版本)
安装:如果使用的是.NET Core 3.0及以上版本,System.Text.Json库已包含在框架中,无需额外安装。
简单类型反序列化:与Newtonsoft.Json类似,使用JsonSerializer.Deserialize方法进行反序列化。
using System.Text.Json; public class Product { public string Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } string productJson = "{\"Id\":\"123\", \"Name\":\"Apple\", \"Price\":3.5}"; Product product = JsonSerializer.Deserialize<Product>(productJson); Console.WriteLine(product.Id); //输出123 Console.WriteLine(product.Name); //输出Apple Console.WriteLine(product.Price); //输出3.5
复杂类型反序列化:对于复杂类型,也可以使用相同的方法进行处理,有一个表示订单的类Order,其中包含一个订单项列表OrderItems,代码如下:
using System.Collections.Generic; using System.Text.Json; public class OrderItem { public string ProductId { get; set; } public int Quantity { get; set; } } public class Order { public string OrderId { get; set; } public List<OrderItem> OrderItems { get; set; } } string orderJson = "{\"OrderId\":\"456\", \"OrderItems\":[{\"ProductId\":\"789\", \"Quantity\":2}]}"; Order order = JsonSerializer.Deserialize<Order>(orderJson); Console.WriteLine(order.OrderId); //输出456 foreach (var item in order.OrderItems) { Console.WriteLine($"ProductId: {item.ProductId}, Quantity: {item.Quantity}"); //输出ProductId: 789, Quantity: 2 }
使用DataContractJsonSerializer类(适用于.NET Framework)
特点:DataContractJsonSerializer是.NET Framework提供的一个用于处理JSON数据的序列化和反序列化的工具,它依赖于数据契约特性来识别要序列化或反序列化的数据类型。
使用示例:首先需要为要序列化或反序列化的类添加数据契约特性,有一个表示员工的类Employee,代码如下:
using System.Runtime.Serialization; [DataContract] public class Employee { [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } }
然后使用DataContractJsonSerializer进行反序列化:
using System.IO; using System.Runtime.Serialization; using System.Text; string json = "{\"Name\":\"John\", \"Age\":30}"; MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Employee)); Employee employee = (Employee)serializer.ReadObject(stream); Console.WriteLine(employee.Name); //输出John Console.WriteLine(employee.Age); //输出30
使用JavaScriptSerializer类(适用于.NET Framework)
特点:JavaScriptSerializer是.NET Framework提供的另一个用于处理JSON数据的序列化和反序列化的工具,它可以将JSON数据转换为对应的C#对象。
使用示例:有一个表示汽车的类Car,代码如下:
using System.Web.Script.Serialization; public class Car { public string Brand { get; set; } public string Model { get; set; } public int Year { get; set; } }
然后使用JavaScriptSerializer进行反序列化:
using System.Web.Script.Serialization; string carJson = "{\"Brand\":\"Toyota\", \"Model\":\"Camry\", \"Year\":2021}"; JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); Car car = jsSerializer.Deserialize<Car>(carJson); Console.WriteLine(car.Brand); //输出Toyota Console.WriteLine(car.Model); //输出Camry Console.WriteLine(car.Year); //输出2021
以下是相关问答FAQs:
问题1:在C#中使用Newtonsoft.Json库进行反序列化时,如果JSON字符串中的字段名与C#对象的属性名不匹配怎么办?
回答:可以通过在反序列化时使用[JsonProperty]特性来指定JSON字段名与C#对象属性名之间的映射关系,JSON字符串中的字段名为first_name,而C#对象中对应的属性名为FirstName,可以这样写:[JsonProperty("first_name")] public string FirstName { get; set; }。
问题2:System.Text.Json库反序列化时如何指定默认值?
回答:可以通过在反序列化时使用JsonSerializerOptions的DefaultValueHandling属性来指定默认值的处理方式,如果希望在反序列化时,对于缺失的值使用默认构造函数创建的对象作为默认值,可以这样设置:var options = new JsonSerializerOptions { DefaultValueHandling = DefaultValueHandling.Populate };。
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/400686.html