You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET控制器动作中将自定义MyId类返回为字符串?

让自定义MyId类在ASP.NET中以字符串形式返回的解决方案

默认情况下,ASP.NET的JSON序列化器会将类的公共成员序列化。如果你的MyId类没有暴露可序列化的公共属性/字段,或者序列化器没有对应的处理逻辑,就会输出空对象{}。而Guid能自动序列化为字符串,是因为框架内置了专门的JSON转换器。要让MyId实现同样的效果,你可以通过自定义JSON转换器来实现,以下是两种常见场景的解决方案:

方案一:针对System.Text.Json(ASP.NET Core 3.0+默认序列化)

1. 定义MyId类(示例)

假设你的MyId类内部封装了一个字符串标识:

public class MyId
{
    public string Value { get; }

    private MyId(string value) => Value = value;

    public static MyId NewId() => new MyId(Guid.NewGuid().ToString());
}

2. 创建自定义JSON转换器

实现JsonConverter<MyId>来控制序列化和反序列化逻辑:

using System.Text.Json;
using System.Text.Json.Serialization;

public class MyIdJsonConverter : JsonConverter<MyId>
{
    public override MyId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var value = reader.GetString();
        return string.IsNullOrEmpty(value) ? null : new MyId(value);
    }

    public override void Write(Utf8JsonWriter writer, MyId value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value?.Value);
    }
}

3. 注册转换器

你可以选择全局注册或在类上标记特性:

  • 全局注册(在Program.cs中):
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new MyIdJsonConverter());
    });
  • 类特性标记:
[JsonConverter(typeof(MyIdJsonConverter))]
public class MyId
{
    // ... 类内容
}

方案二:针对Newtonsoft.Json(适用于手动配置该序列化器的项目)

1. 创建Newtonsoft风格的转换器

using Newtonsoft.Json;

public class MyIdNewtonsoftConverter : JsonConverter<MyId>
{
    public override MyId ReadJson(JsonReader reader, Type objectType, MyId existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var value = reader.Value as string;
        return string.IsNullOrEmpty(value) ? null : new MyId(value);
    }

    public override void WriteJson(JsonWriter writer, MyId value, JsonSerializer serializer)
    {
        writer.WriteValue(value?.Value);
    }
}

2. 注册转换器

  • 全局注册(在Program.cs中):
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Converters.Add(new MyIdNewtonsoftConverter());
    });
  • 类特性标记:
[JsonConverter(typeof(MyIdNewtonsoftConverter))]
public class MyId
{
    // ... 类内容
}

测试效果

配置完成后,控制器返回MyId时就会输出对应的字符串:

public class MyController : ControllerBase
{
    // 现在会返回类似 `"a1b2c3d4-5678-90ef-ghij-klmnopqrstuv"` 的结果
    [HttpGet]
    public MyId Get() => MyId.NewId();
}

内容的提问来源于stack exchange,提问作者Felix ZY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:08:29