【发布时间】: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,它们将被实际传递的值填充。
【问题讨论】:
-
而
Uuid是? -
Uuid 是值类型,如 Guid。它是我们公司的某种内部类型。
-
json.net 没有名为
HandleNull的可覆盖属性,因此显然是System.Text.Json -
您的属性都标记为
[FromQuery],因此它们是查询字符串的一部分而不是正文,因此它们不是 JSON,它们不会被使用JSON 转换器。如果您需要查询字符串值的自定义活页夹,请参阅Custom model binder for QueryString string parameters in ASP.NET Core 3.1?。
标签: c# system.text.json