【问题标题】:Custom Json Converter For Nullable Value Type Does Not Get Called未调用可空值类型的自定义 Json 转换器
【发布时间】:2021-11-18 12:12:02
【问题描述】:

我有两个用于 Uuid 值类型的自定义转换器。一个为可空,另一个为不可空:

public class NullableUuidJsonConverter : JsonConverter<Uuid?>
{
    public override bool HandleNull => true;

    public override Uuid? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (Uuid.TryParse(reader.GetString(), out var parsedUuid))
        {
            return parsedUuid;
        }
        
        return null;
    }

    public override void Write(Utf8JsonWriter writer, Uuid? value, JsonSerializerOptions options)
    {
        if (value == null)
        {
            writer.WriteStringValue((string)null);
        }
        else
        {
            writer.WriteStringValue(value.Value.ToString());
        }
    }
}

public class UuidJsonConverter : JsonConverter<Uuid>
{
    public override Uuid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return new Uuid(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, Uuid value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}

他们是这样注册的:

.AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.Converters.Insert(0, new UuidJsonConverter());
                    options.JsonSerializerOptions.Converters.Insert(1, new NullableUuidJsonConverter());
                });

当我尝试调用请求模型包含可为空的 Uuid 的 API 方法时:

[PublicAPI]
public class Request : IRequest<Response>
{
    [FromQuery(Name = "ids")] public Uuid[] CheckupIds { get; set; }
    [FromQuery(Name = "unitId")][CanBeNull] public Uuid? UnitId { get; set; }
    [FromQuery(Name = "ratingPeriodId")][CanBeNull] public Uuid? RatingPeriodId { get; set; }
}

UnitId 和 RatingPeriodId 用 null 填充。但是,如果我让它们变得简单,不可为空 Uuid,它们将被实际传递的值填充。

【问题讨论】:

标签: c# system.text.json


【解决方案1】:

感谢您的回复。我设法通过使用公开可用的 nuget Dodo.Primitives.Uuid 解决了这个问题

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2019-08-12
    • 2017-02-26
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多