ASP.NET MVC:使用 JsonResult 控制属性名称的序列化

作者:编程家 分类: 编程代码 时间:2025-07-08

使用 JsonResult 控制属性名称的序列化

在 ASP.NET MVC 开发中,经常需要将数据序列化为 JSON 格式返回给前端页面。而在默认情况下,ASP.NET MVC 使用的 JsonResult 类会将属性名称按照 .NET 程序中的命名规则进行序列化,这可能导致前端页面难以理解和处理。不过,幸运的是,我们可以通过一些简单的方法来控制属性名称的序列化,使其更符合前端页面的需求。

使用 DataAnnotations 特性

在 ASP.NET MVC 中,可以通过使用 DataAnnotations 特性来控制属性名称的序列化。DataAnnotations 特性是一组用于控制模型行为的特性,其中包括一些用于序列化的特性。

例如,我们可以使用 DisplayAttribute 特性来控制属性名称的显示。这个特性允许我们为属性指定一个友好的名称,这个名称将用于序列化时的属性名称。

下面是一个示例代码:

csharp

public class Person

{

[Display(Name = "姓名")]

public string Name { get; set; }

[Display(Name = "年龄")]

public int Age { get; set; }

}

在这个示例中,我们使用 DisplayAttribute 特性为 Name 属性和 Age 属性指定了友好的名称。当使用 JsonResult 返回 Person 对象时,属性名称将会按照 DisplayAttribute 特性中指定的名称进行序列化。

自定义属性名称转换器

除了使用 DataAnnotations 特性外,我们还可以通过自定义属性名称转换器来控制属性名称的序列化。属性名称转换器是一个实现了 IContractResolver 接口的类,它负责将属性名称转换为 JSON 格式的属性名称。

下面是一个示例代码:

csharp

public class SnakeCaseContractResolver : DefaultContractResolver

{

protected override string ResolvePropertyName(string propertyName)

{

return propertyName.ToSnakeCase();

}

}

public static class StringExtensions

{

public static string ToSnakeCase(this string input)

{

// 将属性名称转换为 snake_case 格式的属性名称

// 例如,将 "FirstName" 转换为 "first_name"

// 这里省略具体的转换逻辑

return input;

}

}

public ActionResult Index()

{

var person = new Person { Name = "张三", Age = 18 };

var jsonSettings = new JsonSerializerSettings

{

ContractResolver = new SnakeCaseContractResolver()

};

return Json(person, jsonSettings);

}

在这个示例中,我们自定义了一个 SnakeCaseContractResolver 类,它继承了 DefaultContractResolver 类并重写了 ResolvePropertyName 方法。在这个方法中,我们将属性名称转换为 snake_case 格式的属性名称,然后返回给 JsonResult 进行序列化。

最后,在 Index 方法中,我们创建了一个 SnakeCaseContractResolver 对象,并将其设置为 JsonSerializerSettings 的 ContractResolver 属性。然后,将这个 JsonSerializerSettings 对象传给 Json 方法,以便控制属性名称的序列化。

通过使用 DataAnnotations 特性或自定义属性名称转换器,我们可以轻松地控制属性名称的序列化,使其更加符合前端页面的需求。这样,前后端的数据交互就能更加顺畅和高效。