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

ASP.NET中如何实现对应JsonConstructor的ToString序列化?

如何让自定义Point类型通过ToString()方法完成序列化?

ASP.NET提供了便捷的JsonConstructor特性,可将字符串反序列化为复杂类型,示例代码如下:

public record Point
{
    public int X { get; init; }
    public int Y { get; init; }

    [JsonConstructor]
    public Point(string point)
    {
        var m = Regex.Match(point, @"(\d+),(\d+)");
        X = int.Parse(m.Groups[1].Value);
        Y = int.Parse(m.Groups[2].Value);
    }
    
    public override string ToString()
    {
        return $"{X},{Y}";
    }
}

通过上述实现,Point类型可从类似"7,2"的字符串中完成反序列化。现在需要实现反向操作,让Point类型在序列化时直接使用其ToString()方法输出对应的字符串格式,有没有简便的实现方式?


简便实现方案:自定义JsonConverter

最直接且简洁的方式是实现一个JsonConverter<Point>,统一处理序列化和反序列化逻辑:

1. 编写自定义转换器

public class PointConverter : JsonConverter<Point>
{
    // 反序列化逻辑:复用已有的字符串构造函数
    public override Point Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var pointStr = reader.GetString();
        return string.IsNullOrEmpty(pointStr) ? default : new Point(pointStr);
    }

    // 序列化逻辑:直接调用ToString()
    public override void Write(Utf8JsonWriter writer, Point value, JsonSerializerOptions options)
    {
        if (value == null)
        {
            writer.WriteNullValue();
            return;
        }
        writer.WriteStringValue(value.ToString());
    }
}

2. 应用转换器

有两种方式可以让ASP.NET使用这个转换器:

  • 局部标注:给Point类型添加特性
    直接在Point类上标注JsonConverter特性,仅对该类型生效:

    [JsonConverter(typeof(PointConverter))]
    public record Point
    {
        // 原有代码不变
    }
    
  • 全局注册:在项目配置中添加转换器
    如果项目中有多处使用Point类型,推荐全局注册,避免重复标注:

    // 在Program.cs的服务配置中添加
    builder.Services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.Converters.Add(new PointConverter());
        });
    

小提示:修正原反序列化代码的分组错误

原代码中Regex.Match的分组引用存在问题:Groups[0]匹配的是整个字符串(比如"7,2"),而非单独的X或Y数值,正确应该使用Groups[1]和Groups[2]来获取对应数值,否则会导致解析失败,建议按示例中的代码修正。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:00:11