ASP.NET JSON
最后修改于 2023 年 10 月 18 日
在本文中,我们将展示如何在 ASP.NET 中生成和使用 JSON 数据。
ASP.NET 是一个跨平台、高性能、开源的框架,用于构建现代、支持云的 Web 应用程序。它由 Microsoft 开发。
JSON
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。JSON 的官方 Internet 媒体类型是 application/json。JSON 文件名扩展名为 .json。
ASP.NET JSON 示例
在下面的示例中,我们使用最小化 API 发送 JSON 数据。最小化 API 通常用于创建返回 JSON 数据的微服务。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var users = new List<User>
{
new User("John", "Doe", "gardener"),
new User("Roger", "Roe", "driver"),
new User("Jozef", "Kral", "shopkeeper"),
new User("Boris", "Brezov", "musician"),
new User("Lucia", "Novak", "teacher")
};
app.MapGet("/users", () => users);
app.Run("https://:3000");
record User(string FirstName, string LastName, string Occupation);
对于 /users 端点,我们以 JSON 格式发送用户列表。
app.MapGet("/users", () => users);
我们将端点映射到一个 lambda;该 lambda 返回一个用户列表。ASP.NET 会自动将数据转换为 JSON 格式。
$ curl localhost:3000/users -i
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Tue, 04 Oct 2022 15:08:54 GMT
Server: Kestrel
Transfer-Encoding: chunked
[{"firstName":"John","lastName":"Doe","occupation":"gardener"},
{"firstName":"Roger","lastName":"Roe","occupation":"driver"},
{"firstName":"Jozef","lastName":"Kral","occupation":"shopkeeper"},
{"firstName":"Boris","lastName":"Brezov","occupation":"musician"},
{"firstName":"Lucia","lastName":"Novak","occupation":"teacher"}]
HTTP 状态码和内容类型会自动设置。
ASP.NET Results.Json
为了明确意图,我们可以使用 Results.Json。它创建一个 IResult,将指定的数据对象序列化为 JSON。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var users = new List<User>
{
new User("John", "Doe", "gardener"),
new User("Roger", "Roe", "driver"),
new User("Jozef", "Kral", "shopkeeper"),
new User("Boris", "Brezov", "musician"),
new User("Lucia", "Novak", "teacher")
};
app.MapGet("/users", () => Results.Json(users));
app.Run("https://:3000");
record User(string FirstName, string LastName, string Occupation);
对于 /users 路径,我们使用 Results.Json 以 JSON 格式发送用户列表。
ASP.NET 使用 JSON
下一个示例使用来自请求的 JSON 数据。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseRouting();
app.UseEndpoints(endppoints =>
{
endppoints.MapDefaultControllerRoute();
});
app.MapPost("/user", (User user) => Results.Content(user.ToString()));
app.Run("https://:3000");
record User(string FirstName, string LastName, string Occupation);
我们有一个用于发布用户的端点。
app.MapPost("/user", (User user) => Results.Content(user.ToString()));
使用 MapPost,我们将 /user 路径映射到 lambda 表达式。User 记录的属性会自动从请求数据填充。lambda 返回一个文本响应。
$ curl -X POST localhost:3000/user/ -H 'Content-Type: application/json' -d '{"FirstName": "Roger", "LastName":"Roe", "Occupation": "driver"}'
User { FirstName = Roger, LastName = Roe, Occupation = driver }
我们使用 curl 向我们的端点发送一个 post 请求。
ASP.NET JSON 控制器示例
在下面的示例中,我们从控制器发送 JSON 数据。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseRouting();
app.UseEndpoints(endppoints =>
{
endppoints.MapDefaultControllerRoute();
});
app.Run("https://:3000");
我们设置了不带视图的控制器。
using Microsoft.AspNetCore.Mvc;
namespace JsonEx.Controllers;
public class HomeController : Controller
{
[HttpGet("users")]
public JsonResult Context()
{
var users = new List<User>
{
new User("John", "Doe", "gardener"),
new User("Roger", "Roe", "driver"),
new User("Jozef", "Kral", "shopkeeper"),
new User("Boris", "Brezov", "musician"),
new User("Lucia", "Novak", "teacher"),
};
return Json(users);
}
}
record User(string FirstName, string LastName, string Occupation);
我们有一个端点。该操作返回一个 JsonResult。
return Json(users);
我们将数据传递给 Json。
ASP.NET 配置 JSON
在下一个示例中,我们配置了一些 JSON 设置。
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var options = new JsonSerializerOptions(JsonSerializerDefaults.General);
var users = new List<User>
{
new User { FirstName = "John", LastName = "Doe", Occupation = "gardener" },
new User { FirstName = "Roger", LastName = "Roe", Occupation = "driver" },
new User { FirstName = "Jozef", LastName = "Kral", Occupation = "shopkeeper" },
new User { FirstName = "Boris", LastName = "Brezov", Occupation = "musician" },
new User { FirstName = "Lucia", LastName = "Novak", Occupation = "teacher" }
};
app.MapGet("/users", () => Results.Json(users));
app.MapGet("/users2", () => Results.Json(users, options));
app.Run("https://:3000");
class User
{
[JsonPropertyOrder(2)]
public string? FirstName { get; set; }
[JsonPropertyOrder(3)]
public string? LastName { get; set; }
[JsonPropertyOrder(1)]
public string? Occupation { get; set; }
}
在示例中,我们有两个端点。
var options = new JsonSerializerOptions(JsonSerializerDefaults.General);
...
app.MapGet("/users2", () => Results.Json(users, options));
对于第二个端点,我们将 JsonSerializerOptions 作为参数传递。
class User
{
[JsonPropertyOrder(2)]
public string? FirstName { get; set; }
[JsonPropertyOrder(3)]
public string? LastName { get; set; }
[JsonPropertyOrder(1)]
public string? Occupation { get; set; }
}
我们可以使用 JsonPropertyOrder 配置属性的顺序。
$ curl localhost:3000/users
[{"occupation":"gardener","firstName":"John","lastName":"Doe"},
{"occupation":"driver","firstName":"Roger","lastName":"Roe"},
{"occupation":"shopkeeper","firstName":"Jozef","lastName":"Kral"},
{"occupation":"musician","firstName":"Boris","lastName":"Brezov"},
{"occupation":"teacher","firstName":"Lucia","lastName":"Novak"}]
从输出中,我们可以看到 occupation 属性出现在其他两个属性之前。
$ curl localhost:3000/users2
[{"Occupation":"gardener","FirstName":"John","LastName":"Doe"},
{"Occupation":"driver","FirstName":"Roger","LastName":"Roe"},
{"Occupation":"shopkeeper","FirstName":"Jozef","LastName":"Kral"},
{"Occupation":"musician","FirstName":"Boris","LastName":"Brezov"},
{"Occupation":"teacher","FirstName":"Lucia","LastName":"Novak"}]
对于第二个端点,属性的命名已更改。
在本文中,我们展示了如何在 ASP.NET 中生成和使用 JSON。