.NET中JSON数据传输的全面指南
在现代Web开发和服务间通信中,JSON(JavaScript Object Notation)已成为一种轻量级、易读且广泛使用的数据交换格式。.NET框架对JSON的支持非常完善,提供了多种方式来序列化(将.NET对象转换为JSON字符串)和反序列化(将JSON字符串转换为.NET对象),从而实现数据的传输,本文将详细介绍在.NET中如何高效地传输JSON数据类型。
为什么选择JSON进行数据传输?
在探讨具体实现之前,我们先简要回顾一下JSON在数据传输中的优势:
- 轻量级:相比XML,JSON的文本更小,解析速度更快,减少了网络传输的数据量。
- 易读易写:JSON的格式简洁明了,类似于JavaScript对象字面量,人类易于阅读和编写。
- 语言无关性:虽然源于JavaScript,但JSON是一种独立于语言的数据格式,几乎所有编程语言都支持JSON的解析和生成。
- 结构灵活:支持嵌套对象和数组,能够表示复杂的数据结构。
.NET中处理JSON的核心库
.NET处理JSON数据主要依赖于以下两个核心库:
-
System.Text.Json:- 简介:这是.NET Core(.NET 5/6/7/8及更高版本)和.NET Framework 4.7.2+中内置的、高性能的JSON处理库,微软推荐在新项目中优先使用它。
- 优点:高性能、低内存占用、与.NET类型系统集成紧密、支持源生成器(Source Generators)以获得更高性能。
- 命名空间:
System.Text.Json
-
Newtonsoft.Json(也称为Json.NET):- 简介:这是一个非常流行且功能成熟的第三方JSON库,在.NET生态系统中拥有广泛的应用,虽然不是.NET标准库的一部分,但通常通过NuGet包管理器引入。
- 优点:功能丰富、文档完善、社区活跃、高度可定制(如自定义序列化器、转换器等)。
- 命名空间:
Newtonsoft.Json
使用System.Text.Json传输JSON数据
System.Text.Json提供了简洁的API来进行序列化和反序列化。
序列化(Serialization):将.NET对象转换为JSON字符串
using System;
using System.Text.Json;
// 定义一个简单的.NET类
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public DateTime CreatedAt { get; set; }
}
public class Program
{
public static void Main()
{
var user = new User
{
Id = 1,
Name = "张三",
Email = "zhangsan@example.com",
CreatedAt = DateTime.UtcNow
};
// 序列化为JSON字符串,默认使用驼峰命名法(camelCase)
string jsonString = JsonSerializer.Serialize(user);
Console.WriteLine("默认序列化结果:");
Console.WriteLine(jsonString);
// 输出: {"id":1,"name":"张三","email":"zhangsan@example.com","createdAt":"2023-10-27T10:30:00.1234567Z"}
// 序列化为JSON字符串,使用蛇形命名法(snake_case)并格式化
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
WriteIndented = true
};
string formattedJsonString = JsonSerializer.Serialize(user, options);
Console.WriteLine("\n格式化并使用蛇形命名法的结果:");
Console.WriteLine(formattedJsonString);
// 输出:
// {
// "id": 1,
// "name": "张三",
// "email": "zhangsan@example.com",
// "created_at": "2023-10-27T10:30:00.1234567Z"
// }
}
}
反序列化(Deserialization):将JSON字符串转换为.NET对象
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
string jsonString = @"{
""id"": 2,
""name"": ""李四"",
""email"": ""lisi@example.com"",
""createdAt"": ""2023-10-27T12:00:00Z""
}";
// 反序列化为User对象
var user = JsonSerializer.Deserialize<User>(jsonString);
if (user != null)
{
Console.WriteLine($"反序列化成功: ID={user.Id}, Name={user.Name}, Email={user.Email}, CreatedAt={user.CreatedAt}");
}
}
}
在HTTP请求/响应中传输JSON
在ASP.NET Core Web API中,控制器可以轻松地接收JSON请求体并返回JSON响应。
ASP.NET Core Web API 示例:
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
// POST: api/users
[HttpPost]
public IActionResult CreateUser([FromBody] User user) // [FromBody]特性自动将JSON请求体反序列化为User对象
{
if (user == null || string.IsNullOrWhiteSpace(user.Name))
{
return BadRequest("用户名不能为空");
}
// 模拟创建用户...
user.Id = 3;
user.CreatedAt = DateTime.UtcNow;
// 返回CreatedAtResult,响应体中会自动序列化user对象为JSON
return CreatedAtAction(nameof(CreateUser), new { id = user.Id }, user);
}
// GET: api/users/5
[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
// 模拟获取用户
var user = new User { Id = id, Name = "王五", Email = "wangwu@example.com", CreatedAt = DateTime.UtcNow };
// 返回OkResult,响应体中会自动序列化user对象为JSON
return Ok(user);
}
}
客户端(如HttpClient)可以这样调用:
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class HttpClientExample
{
public static async Task CallApiAsync()
{
using (var httpClient = new HttpClient())
{
// 发送POST请求(创建用户)
var newUser = new { Name = "赵六", Email = "zhaoliu@example.com" };
var newUserJson = JsonSerializer.Serialize(newUser);
var content = new StringContent(newUserJson, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://localhost:5001/api/users", content);
if (response.IsSuccessStatusCode)
{
string responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine("POST响应: " + responseContent);
}
// 发送GET请求(获取用户)
response = await httpClient.GetAsync("https://localhost:5001/api/users/5");
if (response.IsSuccessStatusCode)
{
string responseContent = await response.Content.ReadAsStringAsync();
var retrievedUser = JsonSerializer.Deserialize<User>(responseContent);
Console.WriteLine($"GET响应: ID={retrievedUser?.Id}, Name={retrievedUser?.Name}");
}
}
}
}
使用Newtonsoft.Json传输JSON数据
Newtonsoft.Json的使用方式与System.Text.Json类似,但API略有不同。
序列化
using Newtonsoft.Json;
// User类定义同上
var user = new User { Id = 1, Name = "张三", Email = "zhangsan@example.com", CreatedAt = DateTime.UtcNow };
// 序列化为JSON字符串,默认使用驼峰命名法
string jsonString = JsonConvert.SerializeObject(user);
Console.WriteLine("默认序列化结果:");
Console.WriteLine(jsonString);
// 序列化为JSON字符串,使用蛇形命名法并格式化
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver
{
NamingStrategy = new Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy()
}
};
string formattedJsonString = JsonConvert.SerializeObject(user, settings);
Console.WriteLine("\n格式化并使用蛇形命名法的结果:");
Console.WriteLine(formattedJsonString);
反序列化
using Newtonsoft.Json;
string jsonString = @"{
""id"": 2,
""name"": ""李四"",
""email"": ""lisi@example.com"",
""createdAt"": ""2023-10-27T12:00:00Z""
}";
var user = JsonConvert.DeserializeObject<User>(jsonString);
if (user != null)
{
Console.WriteLine($"反序列化成功: ID={user.Id}, Name={user.Name}, Email={user.Email}, CreatedAt={user.CreatedAt}");
}
在ASP.NET Core Web API中使用Newtonsoft.Json
如果项目中使用了Newtonsoft.Json,需要在Startup.cs(或



还没有评论,来说两句吧...