Newtonsoft反序列化不会将字符串转换为DateTime

时间:2019-11-26 18:59:56

标签: c# asp.net .net asp.net-mvc asp.net-core

我正在使用Facebook Graph API,该API将以以下格式返回包含日期时间的json对象,该字符串的格式如下:“ created_time”:“ 2013-01-25T00:11:02 + 0000”

反序列化的对象包含以下日期时间:“ 0001-01-01 00:00:00”,我想它等于null。如何正确反序列化datetime字符串?

这是我的DTO课程:

using System;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Text.Json.Serialization;
using Newtonsoft.Json.Converters;
using project.DTOs;

namespace project.DTOs.Facebook
{
    public class FacebookCommentResponseDto
    {
        [JsonPropertyName("id")]
        public string Id { get; set; }
        [JsonPropertyName("from")]
        public FacebookUserDto From { get; set; }
        [JsonPropertyName("message")]
        public string Message { get; set; }
        [JsonPropertyName("created_time")]
        [JsonConverter(typeof(CustomDateTimeConverter))]
        public DateTime CreatedTime { get; set;}
    }
    internal class CustomDateTimeConverter : IsoDateTimeConverter
    {
        public CustomDateTimeConverter()
        {
            base.DateTimeFormat = "yyyy-MM-ddTH:mm:ss.fffK";
        }
    }
}

这是我反序列化对象的代码:

var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(result);

2 个答案:

答案 0 :(得分:2)

在您的代码中,您有using Newtonsoft.Json.Converters;using System.Text.Json.Serialization;。在FacebookCommentResponseDto上,您使用属于JsonPropertyName的{​​{1}},但转换器类System.Text应该与CustomDateTimeConverter属性Newtonsoft.Json一起使用,而不能与JsonProperty属性System.Text。因此,在您的代码中永远不会调用转换器。

一个解决方案是删除JsonPropertyName并将using System.Text.Json.Serialization;中的JsonPropertyName替换为FacebookCommentResponseDto。这意味着您只使用JsonProperty,然后日期转换甚至可以在没有转换器的情况下直接使用。以下测试为绿色:

Newtonsoft.Json

答案 1 :(得分:0)

正如Marius所说,您的转换器用于Newtonsoft,而属性用于System.Text.Json。您可以将[JsonPropertyName]更改为[JsonProperty]

另一种解决方案是自定义转换器,该转换器在JsonConverter<DateTime>中实现System.Text.Json

1。转换器:

public class FacebookCommentResponseDto
{
    [JsonPropertyName("id")]
    public string Id { get; set; }

    [JsonPropertyName("message")]
    public string Message { get; set; }
    [JsonPropertyName("created_time")]
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime CreatedTime { get; set; }
}
public class CustomDateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        Debug.Assert(typeToConvert == typeof(DateTime));
        return DateTime.Parse(reader.GetString());
    }

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

2。反序列化:

var time = "2013-01-25T00:11:02+0000";
var ID = "1001";                    
var result = "{ \"created_time\": \"" + time + "\", \"id\": \"" + ID + "\" }";
var data = System.Text.Json.JsonSerializer.Deserialize<FacebookCommentResponseDto>(result);