### .NET实体类与JSON相互转换详解
#### 一、引言
在现代软件开发中,数据交换格式的选择至关重要。JSON(JavaScript Object Notation)因其轻量级且易于读写的特点,成为了Web服务中最常用的数据交换格式之一。.NET框架提供了强大的支持来处理JSON数据,使得开发者能够轻松地将实体类序列化为JSON字符串,或将JSON字符串反序列化为实体类。本文将详细介绍如何在.NET中实现这一过程,并提供实际示例。
#### 二、基础知识
在深入了解实现细节之前,我们首先需要了解一些基础概念:
1. **JSON**: 一种轻量级的数据交换格式,常用于服务器端和客户端之间的数据传递。
2. **实体类**: 在.NET中,实体类通常指用来表示业务逻辑中实体对象的类,这些类包含属性和方法,用于存储和处理数据。
3. **序列化**: 将对象的状态转换成可以存储或传输的形式的过程。
4. **反序列化**: 从序列化的形式中重新构建对象的过程。
#### 三、关键技术
.NET提供了多种方式来实现JSON与实体类之间的相互转换,其中最常用的是通过`DataContractJsonSerializer`类。该类位于`System.Runtime.Serialization.Json`命名空间下,主要用于序列化和反序列化数据。
##### 1. 引用添加
在使用`DataContractJsonSerializer`之前,需要确保项目中已经添加了对`System.Runtime.Serialization.Json`的引用。这可以通过以下步骤完成:
- 右键点击项目 -> “管理 NuGet 包” -> 搜索 `System.Runtime.Serialization.Json` 并安装。
##### 2. 序列化
为了将实体类序列化为JSON字符串,我们需要创建一个`DataContractJsonSerializer`实例,并使用其`WriteObject`方法将实体类对象写入到内存流中,然后从内存流中获取JSON字符串。具体实现如下所示:
```csharp
public static string GetJson<T>(T obj)
{
DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
json.WriteObject(ms, obj);
string szJson = Encoding.UTF8.GetString(ms.ToArray());
return szJson;
}
}
```
##### 3. 反序列化
同样地,反序列化操作也依赖于`DataContractJsonSerializer`类。我们首先将JSON字符串转换为字节数组并加载到内存流中,然后使用`ReadObject`方法从内存流中读取对象。具体实现如下:
```csharp
public static T ParseFromJson<T>(string szJson)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
{
DataContractJsonSerializer dcj = new DataContractJsonSerializer(typeof(T));
return (T)dcj.ReadObject(ms);
}
}
```
#### 四、实体类定义
为了演示上述序列化和反序列化的方法,我们定义一个简单的实体类`TestData`,如下所示:
```csharp
public class TestData
{
public int Id { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
}
```
#### 五、示例代码
接下来,我们将使用上述定义的`JsonHelp`类中的方法来序列化和反序列化`TestData`实体类的对象:
```csharp
static void Main(string[] args)
{
// 实体类转JSON
TestData t1 = new TestData();
t1.Id = 1;
t1.Name = "001姓名";
t1.Sex = "男";
// 序列化单个对象
string jsonString = JsonHelp.GetJson(t1);
Console.WriteLine(jsonString);
// 反序列化回对象
TestData deserializedData = JsonHelp.ParseFromJson<TestData>(jsonString);
Console.WriteLine(deserializedData.Name);
// 处理列表
List<TestData> dataList = new List<TestData>
{
t1,
new TestData { Id = 2, Name = "002姓名", Sex = "男" },
new TestData { Id = 3, Name = "003姓名", Sex = "男" }
};
// 序列化列表
string listJson = JsonHelp.GetJson<List<TestData>>(dataList);
Console.WriteLine(listJson);
// 反序列化列表
List<TestData> deserializedList = JsonHelp.ParseFromJson<List<TestData>>(listJson);
foreach (var data in deserializedList)
{
Console.WriteLine($"ID: {data.Id}, Name: {data.Name}, Sex: {data.Sex}");
}
Console.ReadKey();
}
```
#### 六、总结
本文详细介绍了如何在.NET中实现实体类与JSON之间的相互转换。通过使用`DataContractJsonSerializer`,我们可以方便地将实体类对象序列化为JSON字符串,或者将JSON字符串反序列化为实体类对象。这种能力对于构建现代化Web应用至关重要,尤其是在涉及到前后端分离架构的应用中。希望本文能帮助您更好地理解和运用这项技术。