我正在使用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);
答案 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);