【发布时间】:2022-12-14 07:45:57
【问题描述】:
我有一个 .NET 6 解决方案,我试图在调用 JsonObject.ToJsonString() 时覆盖 DateTimeOffset 的默认格式。这都是使用本地System.Text.Json 库。
我添加了一个自定义DateTimeOffsetConverter:
public class DateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
private readonly string _format;
public DateTimeOffsetConverter(string format)
{
_format = format;
}
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
Debug.Assert(typeToConvert == typeof(DateTimeOffset));
return DateTimeOffset.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString(_format));
}
public override bool CanConvert(Type typeToConvert)
{
return (typeToConvert == typeof(DateTimeOffset));
}
}
但是当我尝试使用它时,代码永远不会超出被调用的构造函数。
我错过了什么阻止JsonConverter被调用?
这是我尝试使用该功能的代码:
[Theory]
[InlineData("New Zealand Standard Time")]
[InlineData("India Standard Time")]
[InlineData("Central Brazilian Standard Time")]
[InlineData("W. Australia Standard Time")]
public void DateTimeOffsetIsSerializedCorrectlyTest(string timeZoneId)
{
const string DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffzzz";
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
var dateTimeOffset = new DateTimeOffset(DateTimeOffset.Now.DateTime, timeZoneInfo.BaseUtcOffset);
var json = new JsonObject
{
{ "value", dateTimeOffset }
};
var options = new JsonSerializerOptions
{
Converters = { new DateTimeOffsetConverter(DateTimeFormat) }
};
string jsonString = json.ToJsonString(options);
Assert.Contains(jsonString, dateTimeOffset.ToString(DateTimeFormat));
}
已经发布了许多密切相关的问题,我已经尝试过谁的解决方案,但似乎没有一个能解决我的确切情况。
【问题讨论】:
标签: c# json .net-6.0 system.text.json json-serialization