C# Datetime无法将yyyy-MM-dd'T'HH:mm:ss.SSSZ转换为Datetime。

3

我正在创建一个ASP.net Core Web API项目。

我为来自Webhook(Java API)的请求创建了一个POST端点。

我的C#类:

 public class Data
    {
        [JsonPropertyName("state")]
        public string? state { get; set; }

        [JsonPropertyName("lat")]
        public double? lat { get; set; }

        [JsonPropertyName("lng")]
        public double? lng { get; set; }

        [JsonPropertyName("accuracy")]
        public int? accuracy { get; set; }

        [JsonPropertyName("source")]
        public string? source { get; set; }

        [JsonPropertyName("id")]
        public int? id { get; set; }

        [JsonPropertyName("time")]
        public DateTime? time { get; set; }

        [JsonPropertyName("insertTime")]
        public DateTime? insertTime { get; set; }

        [JsonPropertyName("serial")]
        public string? serial { get; set; }
    }

所以我认为datetime可以处理以下格式:2023-03-01T15:25:00+0000 但是我总是从这种类型中得到一个错误:

"The JSON value could not be converted to System.Nullable`1[System.DateTime]. Path: $.data.time | LineNumber: 0 | BytePositionInLine: 139."

有人有解决方案吗?

提前感谢。

更新:

JSON:

{
"dataType":"location",
"data":{
    "state":"STOP",
    "lat":50.00,
    "lng":5.00,
    "source":"gps",
    "id":1804885154,
    "time":"2023-03-01T11:12:00+0000",
    "insertTime":"2023-03-01T11:18:30+0000",
    "serial":"xxxx"
    }
}

完整的C#类:

 public class SensolusSensorWebhook
{
    [JsonProperty("dataType")]
    public string? DataType { get; set; }

    [JsonProperty("data")]
    public Data? Data { get; set; }
}

public class Data
{
    [JsonPropertyName("state")]
    public string? state { get; set; }

    [JsonPropertyName("lat")]
    public double? lat { get; set; }

    [JsonPropertyName("lng")]
    public double? lng { get; set; }

    [JsonPropertyName("accuracy")]
    public int? accuracy { get; set; }

    [JsonPropertyName("source")]
    public string? source { get; set; }

    [JsonPropertyName("id")]
    public int? id { get; set; }

    [JsonPropertyName("time")]
    public DateTime? time { get; set; }

    [JsonPropertyName("insertTime")]
    public DateTime? insertTime { get; set; }

    [JsonPropertyName("serial")]
    public string? serial { get; set; }

    [JsonPropertyName("thirdPartyId")]
    public string? thirdPartyId { get; set; }
}

Swagger UI 信息: 在 Swagger 中的端点截图

端点代码:

[HttpPost("sensordata/sensolus")]  
    public async Task<ActionResult> PostSensolusWebhook([FromBody] SensolusSensorWebhook? sensorWebhook)
    {
        _logger.LogInformation("Falls in PostSensolusWebhook");
        _logger.LogInformation($"Sensorwebhook: {sensorWebhook.ToString()}");
        await _sensorTestDataService.CreateAsync(sensorWebhook);

        
        return Ok(sensorWebhook);
    }

5
请包含您的JSON。 - ProgrammingLlama
4
2023-03-01T15:25:00+0000 不是与 yyyy-MM-dd'T'HH:mm:ss.SSSZ 相同的格式。 - Enigmativity
实际上,yyyy-MM-dd'T'HH:mm:ss.SSSZ 不是一个有效的格式。你是不是想用 yyyy-MM-dd'T'HH:mm:ss.fffZ 代替它? - Enigmativity
那么,new DateTime(2023,3,1,15,25,2).AddMilliseconds(123).ToString("yyyy-MM-dd'T'HH:mm:ss.fffZ") 将会返回 2023-03-01T15:25:02.123Z。这有帮助吗? - Enigmativity
@ProgrammingLlama 我更新了帖子并添加了更多信息。 - BoeykensBrooklyn
显示剩余2条评论
1个回答

3
你应该在这种情况下使用一个转换器。
var json = File.ReadAllText("data.json");
var options = new JsonSerializerOptions();
var converter = new DateTimeConverterUsingDateTimeParse();

options.Converters.Add(converter);

var data = JsonSerializer.Deserialize<Data>(json, options);

这是转换器类

public class DateTimeConverterUsingDateTimeParse : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        Debug.Assert(typeToConvert == typeof(DateTime));
        return DateTime.Parse(reader.GetString() ?? string.Empty, CultureInfo.InvariantCulture);
    }

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

这段代码来自这里

在配置您的服务时,您可以将自定义转换器添加到您的Web服务器中。

services.AddControllers()
        .AddJsonOptions(options =>
        {
             options.JsonSerializerOptions.Converters.Add(new DateTimeConverterUsingDateTimeParse());
        });

谢谢,在我的本地主机上它正常运行。现在打算在在线服务上尝试一下! 最后一行很有帮助,这样我就不需要将字符串解析为JSON了。谢谢!! - BoeykensBrooklyn
1
感谢您与 Webhook 的配合!!! - BoeykensBrooklyn
1
您正在使用当前区域设置进行解析,这可能会因计算机而异。我建议使用固定语言环境进行解析。或者如果JSON来自某些具体的文化背景,请使用该文化背景进行解析。 - dbc
1
@dbc,我已经编辑了我的答案,使用不变的文化解析日期,谢谢。 - Mad hatter
我建议还要执行 writer.WriteStringValue(value.ToString(CultureInfo.InvariantCulture)) - dbc
@dbc 完成了!你也可以考虑告诉微软团队 :D - Mad hatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接