ZetCode

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 数据的微服务。

Program.cs
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。

Program.cs
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 数据。

Program.cs
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 数据。

Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.UseRouting();
app.UseEndpoints(endppoints =>
{
    endppoints.MapDefaultControllerRoute();
});

app.Run("https://:3000");

我们设置了不带视图的控制器。

Controllers/HomeController.cs
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 设置。

Program.cs
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。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出所有 ASP.NET 教程