如何将空字符串值转换为可为空的日期值?
How can I convert an empty string value to a nullable date value?
当我使用 Postman 通过 PUT 请求测试我的 API 时,出现此错误:
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-fe50a5f13435f11ef5d27de5f91d3c45-47c1ee82a70305a9-00",
"errors": {
"$.extractionDate": [
"The JSON value could not be converted to System.Nullable`1[System.DateTime]. Path: $.extractionDate | LineNumber: 0 | BytePositionInLine: 704."
]
}
我可以看到一个看起来像这样的空字符串正在传递给 API:
"extractionDate":""
在我的模型中,我将 ExtractionDate
属性 设置为可为 null,如下所示:
public DateTime? ExtractionDate { get; set; }
由于我无法控制的事情,使用此 API 的旧系统无法传递空值,它只能为任何空值传递空字符串。
我还需要做些什么才能使 JSON 有效吗?
谢谢!
你可以制作一个扩展方法并在任何地方使用它
public static DateTime? ParseDateOrDefault(this string date)
{
if (string.IsNullOrEmpty(date))
return null;
return DateTime.Parse(date);
}
然后在您的 api 中创建另一个 public 字符串 DateTime 变量,它将接受传入的日期时间。
使用具有新扩展方法逻辑的 getter 和 setter 使您当前的 DateTime 变量成为内部变量。
internal DateTime? MyDate
{
get
{
return MyDateStringVariable.ParseDateOrDefault();
}
...
}
好吧,假设您可以控制 API 和那一端的模型,您可以编写自定义 JsonConverter<DateTime?>
通过返回 [=14] 来处理空的 string
=].
JsonConverter<DateTime?>
的简单实现可能看起来像这样...
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class NullableDateTimeConverter : JsonConverter<DateTime?>
{
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var @string = reader.GetString();
if (string.IsNullOrWhiteSpace(@string))
{
return null;
}
return DateTime.Parse(@string);
}
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
{
if (value != null)
{
writer.WriteStringValue(value.Value.ToString("o"));
}
}
}
然后,您可以告诉您的模型将其与 JsonConverterAttribute
一起使用。
using System;
using System.Test.Json.Serialization;
public class TheModel
{
[JsonConverter(typeof(NullableDateTimeConverter))]
public DateTime? ExtractionDate { get; set; }
}
当我使用 Postman 通过 PUT 请求测试我的 API 时,出现此错误:
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-fe50a5f13435f11ef5d27de5f91d3c45-47c1ee82a70305a9-00",
"errors": {
"$.extractionDate": [
"The JSON value could not be converted to System.Nullable`1[System.DateTime]. Path: $.extractionDate | LineNumber: 0 | BytePositionInLine: 704."
]
}
我可以看到一个看起来像这样的空字符串正在传递给 API:
"extractionDate":""
在我的模型中,我将 ExtractionDate
属性 设置为可为 null,如下所示:
public DateTime? ExtractionDate { get; set; }
由于我无法控制的事情,使用此 API 的旧系统无法传递空值,它只能为任何空值传递空字符串。
我还需要做些什么才能使 JSON 有效吗?
谢谢!
你可以制作一个扩展方法并在任何地方使用它
public static DateTime? ParseDateOrDefault(this string date)
{
if (string.IsNullOrEmpty(date))
return null;
return DateTime.Parse(date);
}
然后在您的 api 中创建另一个 public 字符串 DateTime 变量,它将接受传入的日期时间。 使用具有新扩展方法逻辑的 getter 和 setter 使您当前的 DateTime 变量成为内部变量。
internal DateTime? MyDate
{
get
{
return MyDateStringVariable.ParseDateOrDefault();
}
...
}
好吧,假设您可以控制 API 和那一端的模型,您可以编写自定义 JsonConverter<DateTime?>
通过返回 [=14] 来处理空的 string
=].
JsonConverter<DateTime?>
的简单实现可能看起来像这样...
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class NullableDateTimeConverter : JsonConverter<DateTime?>
{
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var @string = reader.GetString();
if (string.IsNullOrWhiteSpace(@string))
{
return null;
}
return DateTime.Parse(@string);
}
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
{
if (value != null)
{
writer.WriteStringValue(value.Value.ToString("o"));
}
}
}
然后,您可以告诉您的模型将其与 JsonConverterAttribute
一起使用。
using System;
using System.Test.Json.Serialization;
public class TheModel
{
[JsonConverter(typeof(NullableDateTimeConverter))]
public DateTime? ExtractionDate { get; set; }
}