关注墨瑾轩,带你探索编程的奥秘!
超萌技术攻略,轻松晋级编程高手
技术宝库已备好,就等你来挖掘
订阅墨瑾轩,智趣学习不孤单
即刻启航,编程之旅更有趣
Hey,小伙伴们! 今天我们要聊一个超级实用的话题——如何在 ASP.NET Core Web API 中处理 JSON 数据。如果你对 JSON 数据处理还不太熟悉,或者想了解更多高级用法,那么这篇文章绝对值得一看! 我们将一步一步带你深入了解 ASP.NET Core 中 JSON 数据处理的强大功能,并通过具体的代码示例让你轻松上手。废话不多说,让我们开始吧!
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON 通常用于 Web API 中的数据传输。
System.Text.Json
库进行 JSON 处理。在开始之前,确保你已经安装了以下工具:
创建项目
打开 Visual Studio,选择“创建新项目”,然后选择“ASP.NET Core Web API”模板。填写项目名称和位置,点击“创建”。
dotnet new webapi -n JsonApiDemo
安装必要的包
在项目中安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
包,以便使用 Newtonsoft.Json 进行 JSON 处理(可选):
dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson
使用默认的 System.Text.Json
ASP.NET Core 3.0 及以上版本默认使用 System.Text.Json
库进行 JSON 处理。你可以在 Startup.cs
中进行配置:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json.Serialization;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 使用默认的 System.Text.Json
services.AddControllers().AddJsonOptions(options =>
{
// 配置 JSON 序列化选项
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.WriteIndented = true;
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
使用 Newtonsoft.Json
如果你更喜欢使用 Newtonsoft.Json,可以在 Startup.cs
中进行配置:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Serialization;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 使用 Newtonsoft.Json
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.SerializerSettings.Formatting = Formatting.Indented;
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
创建模型
在项目中创建一个 Models
文件夹,并添加一个 User
类:
// Models/User.cs
namespace JsonApiDemo.Models
{
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public DateTime CreatedAt { get; set; }
}
}
创建控制器
在 Controllers
文件夹中创建一个 UsersController
类:
using Microsoft.AspNetCore.Mvc;
using JsonApiDemo.Models;
using System.Collections.Generic;
using System.Linq;
namespace JsonApiDemo.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private static List<User> users = new List<User>
{
new User { Id = 1, Name = "Alice", Email = "[email protected]", PhoneNumber = "123-456-7890", CreatedAt = DateTime.UtcNow },
new User { Id = 2, Name = "Bob", Email = "[email protected]", PhoneNumber = "098-765-4321", CreatedAt = DateTime.UtcNow }
};
[HttpGet]
public ActionResult<IEnumerable<User>> Get()
{
return users;
}
[HttpGet("{id}")]
public ActionResult<User> Get(int id)
{
var user = users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
return NotFound();
}
return user;
}
[HttpPost]
public ActionResult<User> Post(User user)
{
user.Id = users.Max(u => u.Id) + 1;
user.CreatedAt = DateTime.UtcNow;
users.Add(user);
return CreatedAtAction(nameof(Get), new { id = user.Id }, user);
}
[HttpPut("{id}")]
public ActionResult Put(int id, User user)
{
var existingUser = users.FirstOrDefault(u => u.Id == id);
if (existingUser == null)
{
return NotFound();
}
existingUser.Name = user.Name;
existingUser.Email = user.Email;
existingUser.PhoneNumber = user.PhoneNumber;
return NoContent();
}
[HttpDelete("{id}")]
public ActionResult Delete(int id)
{
var user = users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
return NotFound();
}
users.Remove(user);
return NoContent();
}
}
}
运行项目
在 Visual Studio 中按 F5 运行项目,或者在终端中运行:
dotnet run
测试 API
使用 Postman 或浏览器测试 API。例如,访问 https://localhost:5001/api/users
查看用户列表。
你可以在 Startup.cs
中进一步自定义 JSON 序列化选项。例如,配置日期格式:
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.WriteIndented = true;
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ssZ"));
}
}
如果你的数据模型中存在循环引用,可以使用 ReferenceHandler.Preserve
选项来处理:
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
});
你可以在模型类中使用 [JsonIgnore]
属性来忽略特定属性的序列化:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public DateTime CreatedAt { get; set; }
[JsonIgnore]
public string InternalNote { get; set; }
}
通过本文的详细介绍,你已经学会了如何在 ASP.NET Core Web API 中处理 JSON 数据。ASP.NET Core 提供了强大的 JSON 处理功能,可以帮助你轻松应对各种数据交换需求。如果你有任何问题或建议,欢迎在评论区留言交流!✨
希望这篇文章对你有所帮助!如果有任何问题或建议,欢迎随时留言!✨