当前位置:首页 > 行业动态 > 正文

如何在C中实现Json反序列化?

在C#中,实现Json反序列化的方法有多种。常见的是使用Newtonsoft.Json库中的JsonConvert.DeserializeObject方法,将JSON字符串转换为相应的对象。System.Text.Json命名空间下的JsonSerializer.Deserialize方法也能实现类似功能。

在C#中,Json反序列化是将JSON格式的字符串转换为相应的C#对象的过程,以下是几种常见的实现方法:

如何在C中实现Json反序列化?  第1张

使用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 };。

0