如何将空字符串值转换为可为空的日期值?

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; }
}