Runtime: 3.0 рдореЗрдВ TimeSpan рдХреЗ рд▓рд┐рдП JsonSerializer рд╕рдорд░реНрдерди?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЬреВрди 2019  ┬╖  36рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

_рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдкрд╣рд▓реЗ рд╣реА рдХрд╣реАрдВ рдФрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдореЗрд░реА рдЦреЛрдЬ рдХреНрд╖рдорддрд╛ рдереА рддреЛ рдореБрдЭреЗ рд╡рд┐рдлрд▓ рдХрд░ рджрд┐рдпрд╛ред_

рдореИрдВ рдХреБрдЫ рдореМрдЬреВрджрд╛ рдЙрддреНрдкрд╛рджрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЗ рд╕рд╛рде 3.0 рдХреЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 6 рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдмрд╛рд╣рд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдПрдВ рдЙрди рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ рдЬреЛ TimeSpan рдорд╛рди, рдЬрд┐рдиреНрд╣реЗрдВ рддрдм рддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдирдП System.Text.Json API рдХреЗ рд▓рд┐рдП 3.0 рдХреЗ рд▓рд┐рдП TimeSpan рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?

рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рд╕рд┐рддрдВрдмрд░ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдЯрд┐рд╕ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдирдП рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рдЬрд╣рд╛рдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдиреАрдЪреЗ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреНрд░реЛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдореМрдЬреВрджрд╛ JSON .NET рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ TimeSpan рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

using System;
using System.Text.Json.Serialization;
using Xunit;
using JsonConvert = Newtonsoft.Json.JsonConvert;
using JsonSerializer = System.Text.Json.Serialization.JsonSerializer;

namespace JsonSerializerTimeSpanNotSupportedException
{
    public static class Repro
    {
        [Fact]
        public static void Can_Deserialize_Object_With_SystemTextJson()
        {
            // Arrange
            string json = "{\"child\":{\"value\":\"00:10:00\"}}";

            // Act (fails in preview 6, throws: System.Text.Json.JsonException : The JSON value could not be converted to System.TimeSpan. Path: $.child.value | LineNumber: 0 | BytePositionInLine: 28.)
            var actual = JsonSerializer.Parse<Parent>(json, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });

            // Assert
            Assert.NotNull(actual);
            Assert.NotNull(actual.Child);
            Assert.Equal(TimeSpan.FromMinutes(10), actual.Child.Value);
        }

        [Fact]
        public static void Can_Deserialize_Object_With_NewtonsoftJson()
        {
            // Arrange
            string json = "{\"child\":{\"value\":\"00:10:00\"}}";

            var actual = JsonConvert.DeserializeObject<Parent>(json);

            // Assert
            Assert.NotNull(actual);
            Assert.NotNull(actual.Child);
            Assert.Equal(TimeSpan.FromMinutes(10), actual.Child.Value);
        }

        private sealed class Parent
        {
            public Child Child { get; set; }
        }

        private sealed class Child
        {
            public TimeSpan Value { get; set; }
        }
    }
}
api-suggestion area-System.Text.Json json-functionality-doc

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

  • рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдордп рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рдордп рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ ISO8601 рдХреА "рдЕрд╡рдзрд┐" рд╣реЛрдЧреА ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ XML TimeSpan рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА XmlConvert рдФрд░ XsdDuration :

https://github.com/dotnet/corefx/blob/6d723b8e5ae3129c0a94252292322fc19673478f/src/System.Private.Xml/src/System/Xml/XmlConvert.cs#L1128 -L1146

https://github.com/dotnet/corefx/blob/6d723b8e5ae3129c0a94252292322fc19673478f/src/System.Private.Xml/src/System/Xml/Schema/XsdDuration.cs#L229 -L236

рдЕрдм, рдпрдХреАрдирди, TimeSpan рд╣реА ISO8601 рдЕрд╡рдзрд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, DateTime[Offset] рдХреЗ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдк ("O", "o") рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рдХреЗ рд╕рдорд╛рди рдПрдХ рдирдпрд╛ рдорд╛рдирдХ TimeSpan рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛? рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реЛрдЧрд╛ред

рд╕рднреА 36 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ TimeSpan рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рддрдирд╛ рдХрд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓ рдХреЗ рд░реВрдк рдореЗрдВ TimeSpan рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ JsonConverter рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рддрдХ рдПрдХ рдЕрдкрдбреЗрдЯ рджреВрдВрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рджред

рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд╛рдардХ/рд▓реЗрдЦрдХ/JsonElement рдореЗрдВ TimeSpan API рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рдПрдкреАрдЖрдИ рд╕рдореАрдХреНрд╖рд╛ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж - рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ 3.0 рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рднреА рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЙрди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 7 рдХреЗ рд╕рд╛рде рд╢рд┐рдк рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?

рд╣рд╛рдБ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рд╕рдорд░реНрдерди рдЕрдм рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 7 рдореЗрдВ рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдВрдХрд┐ TimeSpan рдПрдХ рд╕рд╛рдорд╛рдиреНрдп BCL рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдирд╡рд░реНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдордиреЗ рдЖрдЬ рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА:

  • рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рддрд░реНрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╣рдо рдЖрд╡рдВрдЯрди рдореБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛рдиреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рд╕реЗ рдмрдЪреЗрдВ)ред
  • рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдордп рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВред
  • рдЕрднреА рдХреЗ рд▓рд┐рдП, рдХрд░реАрдмред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рдорд╛рдг рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдордп рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рдордп рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ ISO8601 рдХреА "рдЕрд╡рдзрд┐" рд╣реЛрдЧреА ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ XML TimeSpan рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА XmlConvert рдФрд░ XsdDuration :

https://github.com/dotnet/corefx/blob/6d723b8e5ae3129c0a94252292322fc19673478f/src/System.Private.Xml/src/System/Xml/XmlConvert.cs#L1128 -L1146

https://github.com/dotnet/corefx/blob/6d723b8e5ae3129c0a94252292322fc19673478f/src/System.Private.Xml/src/System/Xml/Schema/XsdDuration.cs#L229 -L236

рдЕрдм, рдпрдХреАрдирди, TimeSpan рд╣реА ISO8601 рдЕрд╡рдзрд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, DateTime[Offset] рдХреЗ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдк ("O", "o") рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рдХреЗ рд╕рдорд╛рди рдПрдХ рдирдпрд╛ рдорд╛рдирдХ TimeSpan рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛? рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реЛрдЧрд╛ред

рдЗрд╕рдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рднреА рдмрджрд▓ рджрд┐рдпрд╛ рдХрд┐ рдХреИрд╕реЗ AspNetCore рдПрдкреАрдЖрдИ рдореЗрдВ TimeSpan рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, dotnet/AspnetCore#11724 рджреЗрдЦреЗрдВред рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдмрдирд╛рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдЙрдкрд╛рдп рд╣реИ:

public class TimeSpanConverter : JsonConverter<TimeSpan>
    {
        public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            return TimeSpan.Parse(reader.GetString());
        }

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

рдЧреНрд░рд╛рд╣рдХ рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛: рд╣рдорд╛рд░реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░-рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП TimeSpan рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЕрддреНрдпрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрд╕рдореЗрдВ рдЖрдЬ рд╣реА рдПрдХ рдРрдк рдХреЛ .NET Core 3.0 рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдВрдж рд╣реИ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ Microsoft рдХреА рдореВрд▓ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ? @рдЦреЗрд▓рдВрдЧ рдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдареЛрд╕ рддрд░реНрдХ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рд░реЛрдбрдореИрдк рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ...

рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╕реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ 5.0 рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ред ISO8601 рдХреА рдЕрд╡рдзрд┐ рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╕ рдЖрдЬ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд┐рдЫрд▓реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдерд╛ред рд╣рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рддреЛ ISO8601 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдХрд░рдХреЗред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд┐рдЫрд▓реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдерд╛ред

@mfeingol рдХреНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░? рдХрд┐ рдпрд╣ рдмрд╕ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ?

рд╣рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рддреЛ ISO8601 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдХрд░рдХреЗред

рдХреЗрд╡рд▓ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди @rezabayesteh рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

@khellang : рдореИрдВрдиреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╡реЗрдирд┐рд▓рд╛ ASP.NET рдХреЛрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬреЛ рджреЗрдЦрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ Timespan? рдХреЛ HasValue рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЯрд╛рдЗрдорд╕реНрдкреЗрди рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИред

рдХреЗрд╡рд▓ рд╕рдорд╛рдзрд╛рди рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ

рдореИрдВрдиреЗ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдЖрдЬ рд╣реА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рд╣реИ (рдореЗрд░реЗ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ) рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк.рд╕реАрдПрд╕ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ.рдЬреЗрд╕рди рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд╕рднреА рдПрд╕реНрдкрдиреЗрдЯ рд╡реЗрдмрдкреА рдФрд░ рдРрдкреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

рд╕реЗрд╡рд╛рдПрдВред рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝реЗрдВ ()
AddNewtonsoftJson (рд╡рд┐рдХрд▓реНрдк =>
{
options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
});

рдореЗрд░реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдХреБрдЫ рдЕрд╢рдХреНрдд TimeSpan (TimeSpan?) рдФрд░ System.Text.Json рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

{
"рд╣реИрд╡реИрд▓реНрдпреВ": рд╕рдЪ рд╣реИ,
"рдореВрд▓реНрдп": {
"рдЯрд┐рдХ": 0,
"рджрд┐рди": 0,
"рдШрдВрдЯреЗ": 0,
"рдорд┐рд▓реАрд╕реЗрдХрдВрдб": 0,
"рдорд┐рдирдЯ": 0,
"рд╕реЗрдХрдВрдб": 0,
"рдХреБрд▓ рджрд┐рди": 0,
"рдХреБрд▓ рдШрдВрдЯреЗ": 0,
"рдХреБрд▓ рдорд┐рд▓реАрд╕реЗрдХрдВрдб": 0,
"рдХреБрд▓ рдорд┐рдирдЯ": 0,
"рдХреБрд▓ рд╕реЗрдХреЗрдВрдб": 0
}
}

рдпрд╣ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (рдЕрд░реНрдерд╛рддреН рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ) рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ deserializers рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдореИрдВ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдХреЗ рд╕рдорд╛рди рдХреНрд░рдордмрджреНрдзрддрд╛ рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЬреЗрд╕рди рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░:

{
"рдЯрд╛рдЗрдорд╕реНрдкреИрди": "00:00:00.0000000",
"рдирд▓рдЯрд╛рдЗрдорд╕реНрдкреИрди": рд╢реВрдиреНрдп
}

рдореБрдЭреЗ рдЖрдЬ рд╣реА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рд╣реИ (рдореЗрд░реЗ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ) рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рднреА рдПрд╕реНрдкрдиреЗрдЯ рд╡реЗрдмрдкреА рдФрд░ рдРрдкреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

@bashocz https://github.com/dotnet/corefx/issues/38641#issuecomment -540200476 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?

#38641 (рдЯрд┐рдкреНрдкрдгреА) рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?

@рдЦреЗрд▓рдВрдЧ рдореИрдВ рд╕рд┐рд░реНрдл

рдореИрдВрдиреЗ рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ рдирдП System.Text.Json рдХреА рдЬрд╛рдВрдЪ рдХреА рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдлреАрдЪрд░ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ dotnet/corefx#41747 рдПрдХ рдореБрджреНрджрд╛ рдЙрдард╛рдпрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп dotnet/corefx#39031, dotnet/corefx#41325, dotnet/corefx#38650 рд╕рдВрдмрдВрдзрд┐рдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕рдХреЗ рдХрд╛рд░рдг рд╣рдорд╛рд░реЗ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдЕрднреА рднреА рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ.рдЬреЗрд╕рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдФрд░ рд╡реЗрдмрдПрдк рдкрд░ рднреА рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрд╡реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред

рдмреАрдЯреАрдбрдмреНрд▓реВ: рдореИрдВ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдХрд╛рдордХрд╛рдЬ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ .. рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

@рдЦреЗрд▓рдВрдЧ , рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдиреА рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рдд рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред .NET рдХреЛрд░ 3 рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХреА рдЧрдИ рдПрдХ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рдореЗрдВ рдРрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХрдореА рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

@arisewanggithub рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЖрдк рдЗрд╕реЗ AddJsonOptions() рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк JsonSerializerOptions рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ Json() рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдмрдВрдж рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ ?!

рдХреНрдпрд╛ рдпрд╣ рдмрдВрдж рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд░ рд░рд╣реЗ рд╣реИрдВ ?!

рдореБрджреНрджрд╛ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ, рдПрдХ рдПрдкреАрдЖрдИ/рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡, рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рдВрдмрд┐рдд рд╣реИред рдЗрд╕ рдмреАрдЪ, https://github.com/dotnet/corefx/issues/38641#issuecomment -540200476 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХрдирд╡рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ (JsonTimeSpanConverter) рдХреЗ рд╕рд╛рде рдПрдХ NuGet рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо 5.0 рдбреНрд░реЙрдк рд╕реЗ тАЛтАЛрдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Macross.Json.Extensions

TimeSpan рдФрд░ Nullable<TimeSpan> рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдУрд╣, рдмрдХрд╡рд╛рд╕, рдпрд╣ рджрд░реНрдж рд╣реЛрддрд╛ рд╣реИ!

рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ (JsonTimeSpanConverter) рдХреЗ рд╕рд╛рде рдПрдХ NuGet рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо 5.0 рдбреНрд░реЙрдк рд╕реЗ тАЛтАЛрдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Macross.Json.Extensions

TimeSpan рдФрд░ Nullable рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИрдкреНрд░рдХрд╛рд░ред

рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрд╢рдХреНрдд рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдврд╛рдВрдЪреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

public class DelegatedStringJsonConverter<T> : JsonConverter<T>
    where T : notnull
{
    private static readonly bool s_typeAllowsNull = !typeof(T).IsValueType || Nullable.GetUnderlyingType(typeof(T)) != null;

    private readonly Func<string, T> _parse;
    private readonly Func<T, string> _toString;

    public DelegatedStringJsonConverter(Func<string, T> parse, Func<T, string> toString)
    {
        _parse = parse;
        _toString = toString;
    }

    public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // null tokens are handled by the framework except when the expected type is a non-nullable value type
        // https://github.com/dotnet/corefx/blob/v3.1.4/src/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Read.HandleNull.cs#L58
        if (!s_typeAllowsNull && reader.TokenType == JsonTokenType.Null)
            throw new JsonException($"{typeof(T)} does not accept null values.");

        return _parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
    {
        // value is presumably not null here as null values are handled by the framework
        writer.WriteStringValue(_toString(value));
    }
}

(рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдврд╛рдВрдЪреЗ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╢реВрдиреНрдп рдЯреЛрдХрди/рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рддрджрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред)

рдлрд┐рд░ JsonSerializerOptions рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:

options.Converters.Add(new DelegatedStringJsonConverter<TimeSpan>(
    value => TimeSpan.Parse(value, CultureInfo.InvariantCulture),
    value => value.ToString(null, CultureInfo.InvariantCulture)));

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рддреГрддреАрдп рдкрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЖрдЦрд┐рд░ рд╣рдо рдПрдирдкреАрдПрдо рдХреА рдЬрдореАрди рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред ;)

рдмреЗрд╢рдХ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@adams85 FYI рдХрд░реЗрдВ Nullable рдорд╛рди рдкреНрд░рдХрд╛рд░ рдЦрд░рд╛рдм рд╣реИрдВ <.NET 5 рдЬрдм JsonConverterAttribute рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред #32006 рджреЗрдЦреЗрдВред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рдмрдЧ рдлрд┐рдХреНрд╕, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдХрдирд╡рд░реНрдЯрд░ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рд╣реИ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдореИрдХреНрд░реЙрд╕.рдЬреЗрд╕рди.рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВ рддреЛ рдХрд┐рд╕реА рдФрд░ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЕрд╡рд╕рд░ рдкрд░ "рдПрдирдкреАрдПрдо рднреВрдорд┐" рдХреА рдпрд╛рддреНрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ? :)

@CodeBlanch рдЗрд╕ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛ рдХреЛ JsonConverterAttribute рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░реА рдХрд╣рд╛рдиреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдореЗрд░реЗ рдХрдирд╡рд░реНрдЯрд░ рдХреЛ рдЕрдкрдиреЗ lib рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред :)

.NET 5.0 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 5 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рдореБрдЭреЗ Cannot skip tokens on partial JSON рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ, рдЬреЛ рдореЗрд░реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ System.Text.Json рдХреЗ рд╕рд╛рде JSON рдореЗрдВ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдкрд┐рдВрдЧ рдХрд░ рд░рд╣реА рд╣реИрдВред рдЕрдкрдорд╛рдирдЬрдирдХ рд░реЗрдЦрд╛ рдФрд░ рдЪрд░рд┐рддреНрд░ "Ticks": рдореЗрдВ рдХреЛрд▓рди рд╣реИ

рд╡реИрд╕реЗ рднреА рдЕрдЧрд░ рдореИрдВ рдХрд╛рдордХрд╛рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ TimeSpan рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реА рдУрд░ рд╕реЗ +1 рдХреНрдпреЛрдВрдХрд┐ .json рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдкрд░ рдореЗрд░реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рдЗрд╕рдХреА рд╕рднреА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдорд╣рд┐рдорд╛ рдореЗрдВ рдХреНрд░рдордмрджреНрдз TimeSpan рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП "рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ ..." рдереАред

https://github.com/dotnet/runtime/issues/42356 рдореЗрдВ @jsedlak рд╕реЗ:

рдЕрдВрдХ рд╢реАрд░реНрд╖рдХ

System.Text.Json.JsonSerializer рдХреНрд▓рд╛рд╕ TimeSpan рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХреЗред

рдЖрдо

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдирдореВрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: https://github.com/jsedlak/TestTimeSpan

рдпрджрд┐ рдЖрдк WebApi рдореЗрдВ TimeSpan рдЧреБрдг рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ JSON рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреНрд░рдордмрджреНрдз рд╣реИ:

[ { "forecastLength": { "ticks": 36000000000, "days": 0, "hours": 1, "milliseconds": 0, "minutes": 0, "seconds": 0, "totalDays": 0.041666666666666664, "totalHours": 1, "totalMilliseconds": 3600000, "totalMinutes": 60, "totalSeconds": 3600 } } ]

рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ deserializer рдПрдХреНрд╕рдЯреЗрдВрд╢рди ( HttpClient.GetFromJsonAsync ) рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЦрд╛рд▓реА TimeSpan рджреЗрддрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбреЙрдЯрдиреЗрдЯ рдЬрд╛рдирдХрд╛рд░реА

`.NET рдХреЛрд░ рдПрд╕рдбреАрдХреЗ (рдХрд┐рд╕реА рднреА Global.json рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ):
рд╕рдВрд╕реНрдХрд░рдг: 3.1.302
рдкреНрд░рддрд┐рдмрджреНрдз: 41faccf259

рдХреНрд░рдо рдкрд░реНрдпрд╛рд╡рд░рдг:
рдУрдПрд╕ рдХрд╛ рдирд╛рдо: рд╡рд┐рдВрдбреЛрдЬрд╝
рдУрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг: 10.0.20201
рдУрдПрд╕ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо: рд╡рд┐рдВрдбреЛрдЬрд╝
рдЖрд░рдЖрдИрдбреА: win10-x64
рдЖрдзрд╛рд░ рдкрде: C:\Program Files\dotnet\sdk3.1.302\

рдореЗрдЬрдмрд╛рди (рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА):
рд╕рдВрд╕реНрдХрд░рдг: 3.1.6
рдкреНрд░рддрд┐рдмрджреНрдз: 3acd9b0cd1

.NET рдХреЛрд░ рдПрд╕рдбреАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд:
3.1.302 [рд╕реА:\рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓реЗрдВ\рдбреЙрдЯрдиреЗрдЯ\sdk]

.NET рдХреЛрд░ рд░рдирдЯрд╛рдЗрдо рд╕реНрдерд╛рдкрд┐рдд:
Microsoft.AspNetCore.All 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]`

рд╣рдо рдЗрд╕реЗ .NET 6.0 рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдФрд░ рдпрд╣рд╛рдВ рд╕рдореБрджрд╛рдп рдХреЗ рдпреЛрдЧрджрд╛рди рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдмреАрдЪ рд╕рдорд╛рдзрд╛рди рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреИрд╕реЗ https://github.com/dotnet/runtime/issues/29932#issuecomment -540200476ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди DateTime рдФрд░ DateTimeOffset рдХреЗ

рд╣рдо рдЗрд╕реЗ .NET 6.0 рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ

.NET 5 рдЕрднреА рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдЕрдЧрд░ рд╣рдо v6 рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп v5 (рд╕реЗрд╡рд░ рдкреНрд░рдореБрдЦ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди v3 => v5) рдореЗрдВ рдмреБрд▓реЗрдЯ рдХреЛ рдмрд┐рдЯ рдХрд░реЗрдВред

рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ 5.0 рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗред рд╣рдореЗрдВ рдмрд╛рдХреА 5.0 рдлреАрдЪрд░ рдХрд╛рдо рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреА рдереА, рдФрд░ рдпрд╣ рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛ред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдпрд╣ рдХрдЯ рд▓рд╛рдЗрди рдХреЗ рдХрд░реАрдм рдерд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрд░ рд╕реЗ рдХрджрдоред

рдмрд╕ рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

public class TimeSpanConverter : JsonConverter<TimeSpan>
{
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return TimeSpan.Parse(reader.GetString());
    }

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

var options = new JsonSerializerOptions { Converters = { new TimeSpanConverter() };
JsonSerializer.Serialize(myObj, options);

...

@layomia , рдореИрдВ рдЗрд╕реЗ 6.0 рдХреЗ рд▓рд┐рдП рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВред

рдЬрдм рдореИрдВ рд╕реНрд╡рдпрдВ рдПрдХ рдЬреЛрдВрд╕ рдХрдиреНрд╡рд░реНрдЯрд░ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрд╕реНрдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реВрдВрдЧрд╛:

public class TimeSpanConverter : JsonConverter<TimeSpan>
{
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return TimeSpan.Parse(reader.GetString(), CultureInfo.InvariantCulture);
    }

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

рдореИрдВ рдПрдПрд╕рдкреАрдиреЗрдЯ рдХреЛрд░ 3.1 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЖрдЬ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдореИрдВ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рд╕рд┐рдЧреНрдирд▓рд░ рдФрд░ рдЗрдирд▓рд╛рдЗрди рд╕рдВрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдЯреЗрд▓реАрд░рд┐рдХреНрд╕ рдЧреНрд░рд┐рдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рдирд▓рдмрд▓ рдЯрд╛рдЗрдордкреИрди рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрд▓реЛрдб рдореЗрдВ рдЯрд╛рдЗрдордкреИрди рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ Macros.Json.Extensions рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХреБрдЫ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрджрд░реНрд╢ рдирд╣реАрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдлрд┐рдХреНрд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдФрд░ рдпрджрд┐ рдЖрдк ISO8601 рдкреНрд░рд╛рд░реВрдк рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
```рд╕реА#

public class TimeSpanConverter : JsonConverter<TimeSpan>
{
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var stringValue = reader.GetString();
        return System.Xml.XmlConvert.ToTimeSpan(stringValue); //8601
    }

    public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
    {
        var stringValue = System.Xml.XmlConvert.ToString(value); //8601
        writer.WriteStringValue(stringValue);
    }
}

```

рдХреГрдкрдпрд╛ рдХрдо рд╕реЗ рдХрдо 24 рдШрдВрдЯреЛрдВ рдХреЗ TimeSpan рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ.. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "24:00:00" new TimeSpan(24, 0, 0) рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

@gojanpaolo

рдХреГрдкрдпрд╛ рдХрдо рд╕реЗ рдХрдо 24 рдШрдВрдЯреЗ рдХреЗ рдЯрд╛рдЗрдорд╕реНрдкреИрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ .. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "24:00:00" рдирдП рдЯрд╛рдЗрдорд╕реНрдкреИрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (24, 0, 0)

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ JSON рдЪреАрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рдпрд╣ TimeSpan рдкрд╛рд░реНрд╕ рддрд░реНрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░: 24 рдШрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП "1.00:00:00" рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рд▓рдВрдмрд╛ рдЙрддреНрддрд░: рдореИрдВ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдпрд╛ рдерд╛ рдХрд┐ "24: 00: 00" рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

v0l picture v0l  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jkotas picture jkotas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Timovzl picture Timovzl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chunseoklee picture chunseoklee  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sahithreddyk picture sahithreddyk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ