Преобразователь:
Код: Выделить всё
///
/// Convert a json value expressed as a time span in seconds to a TimeSpan.
///
internal class IntToTimeSpanJsonConverter : JsonConverter
{
public override bool CanConvert(Type typeToConvert)
=> typeToConvert.IsAssignableTo(typeof(TimeSpan));
public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
int seconds = reader.GetInt32();
TimeSpan res = TimeSpan.FromSeconds(seconds);
return res;
}
public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
=> throw new NotImplementedException();
}
Код: Выделить всё
public class IntToTimeSpanJsonConverter_Tests
{
private JsonSerializerOptions _defaultOptions;
public IntToTimeSpanJsonConverter_Tests()
=> _defaultOptions=new JsonSerializerOptions();
[Fact]
public void Read_ShouldReturnCorrectTimeSpan()
{
// Assign
string json = /*lang=json*/ @"{
""IntegerTimeProperty"" : 900
}";
TestResponseWithTimeSpanConverter expected = new()
{
IntergerTimeProperty=TimeSpan.FromSeconds(900)
};
// Act
TestResponseWithTimeSpanConverter? act = JsonSerializer.Deserialize(json, _defaultOptions);
// Assert
act.Should().BeEquivalentTo(expected);
}
}
Код: Выделить всё
public class TestResponseWithTimeSpanConverter
{
[JsonConverter(typeof(IntToTimeSpanJsonConverter))]
public TimeSpan IntergerTimeProperty { get; set; }
}
Я пытался добавить конвертер непосредственно в список конвертеров JsonSerializerOptions, и у меня те же симптомы, но CanConvert вызывается для каждого типа.
Это похоже на атрибут JsonConverter распознается, но либо не используется, либо используется другой преобразователь по умолчанию. Я проверил свойство Converter JsonSerializationOptions, и оно пусто.
Я пытался отследить методы System.Text.Json, чтобы сравнить трассировку между этим преобразователем и другим перечислением, которое работает, но сложность делает операцию невозможной или потребуется много времени, чтобы понять процесс.
Вопрос: кто-нибудь знает, почему метод Read моего конвертера не вызывается?
Вопрос: кто-нибудь знает, почему метод Read моего конвертера не вызывается?
п>
Подробнее здесь: https://stackoverflow.com/questions/790 ... not-called
Мобильная версия