Runtime: рдирдпрд╛ Asp.NET Core 3.0 Json рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ<key/>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЕрдЧре░ 2019  ┬╖  51рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

.NET рдХреЛрд░ 3.0 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 7

Asp.NET рд╡реЗрдм рдПрдкрд┐рд╕, рдЬрдм рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рд╕рдорд░реНрдерд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдиреАрдЪреЗ рдЕрдкрд╡рд╛рдж рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, ControllerBase.BadRequest рд╡рд┐рдзрд┐ ModelStateDictionary , рд▓реЗрдХрд┐рди рдЬрдм рд╡рд╣ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ рддреЛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдПрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЙрдбрд╝рд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдорд░реНрдерди рдХрдм рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛? рдЪреВрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП Json.net рдФрд░ рдЕрдиреНрдп рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░рдбрд╛рд░ рдкрд░ рд╣реИред

рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ Json.net рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рд╢рдмреНрджрдХреЛрд╢ рд▓реМрдЯрд╛рддреЗ рд╕рдордп рдЕрдкрд╡рд╛рдж
System.NotSupportedException: рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ 'System.Collections.Generic.Dictionary`2[System.Int32,System.String]' рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
System.Text.Json.JsonClassInfo.GetElementType рдкрд░ (рдкреНрд░реЙрдкрд░реНрдЯреА рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдкреЗрд░реЗрдВрдЯ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, MemberInfo MemberInfo, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
рд╕рд┐рд╕реНрдЯрдо рдкрд░ред
рд╕рд┐рд╕реНрдЯрдо рдкрд░ред
System.Text.Json.JsonClassInfo.AddPolicyProperty рдкрд░ (рдкреНрд░реЙрдкрд░реНрдЯреА рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
System.Text.Json.JsonClassInfo..ctor рдкрд░ (рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
System.Text.Json.JsonSerializerOptions.GetOrAddClass (рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдЯрд╛рдЗрдк) рдкрд░
System.Text.Json.WriteStackFrame.Initialize рдкрд░ (рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
System.Text.Json.JsonSerializer.WriteAsyncCore (рд╕реНрдЯреНрд░реАрдо utf8Json, рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд▓реНрдпреВ, рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк, рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди)
Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync (OutputFormatterWriteContext рдкреНрд░рд╕рдВрдЧ, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЪрдпрдирд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync (OutputFormatterWriteContext рдкреНрд░рд╕рдВрдЧ, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЪрдпрдирд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редg__Logged|21_0(ResourceInvoker рдЖрд╡реЗрджрдХ, IActionResult рдкрд░рд┐рдгрд╛рдо)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редрдЬреА__рдкреНрд░рддреАрдХреНрд╖рд┐рдд|29_0 рдЯреАрдлрд┐рд▓реНрдЯрд░,рдЯреАрдлрд┐рд▓реНрдЯрд░рдПрд╕рд┐рдВрдХ
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed рдкреНрд░рд╕рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext TFilter, TFilterAsync рдкрд░
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters() рдкрд░
--- рдкрд┐рдЫрд▓реЗ рд╕реНрдерд╛рди рд╕реЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХрд╛ рдЕрдВрдд рдЬрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдерд╛ ---
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редg__рдкреНрд░рддреАрдХреНрд╖рд┐рдд|19_0(ResourceInvoker invoker, рдЯрд╛рд╕реНрдХ рд▓рд╛рд╕реНрдЯ рдЯрд╛рд╕реНрдХ, рд╕реНрдЯреЗрдЯ рдиреЗрдХреНрд╕реНрдЯ, рд╕реНрдХреЛрдк рд╕реНрдХреЛрдк, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЗрдЯ, рдмреВрд▓рд┐рдпрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редg__Logged|17_1(ResourceInvoker рдЖрд╡реЗрджрдХ)
Microsoft.AspNetCore.Routing.EndpointMiddleware рдкрд░редg__AwaitRequestTask|6_0(рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ, рдХрд╛рд░реНрдп рдЕрдиреБрд░реЛрдз рдХрд╛рд░реНрдп, ILogger рд▓рдХрдбрд╝рд╣рд╛рд░рд╛)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Builder.Extensions.MapHowMiddleware.Invoke (HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░
Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke (HttpContext httpContext) рдкрд░
Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke рдкрд░ (HttpContext httpContext, ISwaggerProvider swaggerProvider)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░

BadRequest рд▓реМрдЯрд╛рддреЗ рд╕рдордп рдЕрдкрд╡рд╛рдж
System.NotSupportedException: рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ 'Microsoft.AspNetCore.Mvc.SerializableError' рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
System.Text.Json.JsonClassInfo.GetElementType рдкрд░ (рдкреНрд░реЙрдкрд░реНрдЯреА рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдкреЗрд░реЗрдВрдЯ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, MemberInfo MemberInfo, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
рд╕рд┐рд╕реНрдЯрдо рдкрд░ред
рд╕рд┐рд╕реНрдЯрдо рдкрд░ред
System.Text.Json.JsonClassInfo.AddPolicyProperty рдкрд░ (рдкреНрд░реЙрдкрд░реНрдЯреА рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд░реЗрдВ, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
System.Text.Json.JsonClassInfo..ctor рдкрд░ (рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
System.Text.Json.JsonSerializerOptions.GetOrAddClass (рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдЯрд╛рдЗрдк) рдкрд░
System.Text.Json.WriteStackFrame.Initialize рдкрд░ (рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
System.Text.Json.JsonSerializer.WriteAsyncCore (рд╕реНрдЯреНрд░реАрдо utf8Json, рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд▓реНрдпреВ, рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк, JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк, рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди)
Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync (OutputFormatterWriteContext рдкреНрд░рд╕рдВрдЧ, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЪрдпрдирд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync (OutputFormatterWriteContext рдкреНрд░рд╕рдВрдЧ, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЪрдпрдирд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редg__Logged|21_0(ResourceInvoker рдЖрд╡реЗрджрдХ, IActionResult рдкрд░рд┐рдгрд╛рдо)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редрдЬреА__рдкреНрд░рддреАрдХреНрд╖рд┐рдд|29_0 рдЯреАрдлрд┐рд▓реНрдЯрд░,рдЯреАрдлрд┐рд▓реНрдЯрд░рдПрд╕рд┐рдВрдХ
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed рдкреНрд░рд╕рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext TFilter, TFilterAsync рдкрд░
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters() рдкрд░
--- рдкрд┐рдЫрд▓реЗ рд╕реНрдерд╛рди рд╕реЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХрд╛ рдЕрдВрдд рдЬрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдерд╛ ---
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редg__рдкреНрд░рддреАрдХреНрд╖рд┐рдд|19_0(ResourceInvoker invoker, рдЯрд╛рд╕реНрдХ рд▓рд╛рд╕реНрдЯ рдЯрд╛рд╕реНрдХ, рд╕реНрдЯреЗрдЯ рдиреЗрдХреНрд╕реНрдЯ, рд╕реНрдХреЛрдк рд╕реНрдХреЛрдк, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЗрдЯ, рдмреВрд▓рд┐рдпрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker рдкрд░редg__Logged|17_1(ResourceInvoker рдЖрд╡реЗрджрдХ)
Microsoft.AspNetCore.Routing.EndpointMiddleware рдкрд░редg__AwaitRequestTask|6_0(рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ, рдХрд╛рд░реНрдп рдЕрдиреБрд░реЛрдз рдХрд╛рд░реНрдп, ILogger рд▓рдХрдбрд╝рд╣рд╛рд░рд╛)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░
Microsoft.AspNetCore.Builder.Extensions.MapHowMiddleware.Invoke (HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░
Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke (HttpContext httpContext) рдкрд░
Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke рдкрд░ (HttpContext httpContext, ISwaggerProvider swaggerProvider)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (HttpContext рдкреНрд░рд╕рдВрдЧ) рдкрд░

area-System.Text.Json enhancement

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

рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди Newtonsoft.Json рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╣реИред

  1. Microsoft.AspNetCore.Mvc.NewtonsoftJson рдкреИрдХреЗрдЬ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗрдВред
  2. .AddNewtonsoftJson() рдХреЛ .AddControllers() / .AddMvc() рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдпреЛрдЬрди рдХреЗ рдареАрдХ рдмрд╛рдж рдЬреЛрдбрд╝реЗрдВред

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

рджреЛрдиреЛрдВ "рд╕рдорд░реНрдерд┐рдд рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ" рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рднреАрддрд░ рд╕реАрдорд╛рдПрдВ рд╣реИрдВ рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо 3.0 рдореЗрдВ рд╢рд┐рдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП)ред

рдпрд╣ рд╕рдорд░реНрдерди рдХрдм рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛? рдЪреВрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП Json.net рдФрд░ рдЕрдиреНрдп рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░рдбрд╛рд░ рдкрд░ рд╣реИред
рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ Json.net рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд░рдбрд╛рд░ рдкрд░ vNext (рдЗрд╕рд▓рд┐рдП 5.0) рдФрд░ рдЙрд╕рд╕реЗ рдЖрдЧреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╕реНрдЯрдо рдбрд┐рдХреНрд╢рдирд░реА рд╕рдорд░реНрдерди рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

Asp.NET рд╡реЗрдм рдПрдкрд┐рд╕, рдЬрдм рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рд╕рдорд░реНрдерд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╕рдордп, рдЖрдЬ рдХреЗрд╡рд▓ Dictionary<string, TValue> рд╕рдорд░реНрдерд┐рдд рд╣реИ (рдЕрд░реНрдерд╛рдд TKeys рдЬреЛ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрдВ)ред рдЖрдкрдХрд╛ рд╢рдмреНрджрдХреЛрд╢ <int, string> рдЬреЛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
https://github.com/dotnet/corefx/blob/93d7aa1c1737b6da29d04b78557215e18eb786d4/src/System.Text.Json/tests/Serialization/DictionaryTests.cs#L385 -L390

@steveharter , @layomia - рдХреНрдпрд╛ рдЗрд╕ рдмреАрдЪ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ? 5.0 рдХреЗ рд▓рд┐рдП рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рднреАрддрд░ рдЧреИрд░-рд╕реНрдЯреНрд░рд┐рдВрдЧ key'd рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧреЗрдЧрд╛?

System.NotSupportedException: рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ 'Microsoft.AspNetCore.Mvc.SerializableError' рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

~ SerializableError рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдореЗрд░реЗ рд░рдбрд╛рд░ рдкрд░ рдирд╣реАрдВ рдерд╛ред @pranavkm , @rynowak - рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╕рдВрджрд░реНрдн рд╣реИ? рдореИрдВ ModelStateDictionary рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдХреНрдпрд╛ рдЗрд╕реЗ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдорд╡реАрд╕реА рдХреЗ рднреАрддрд░ рд╣реА рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?~

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрдп рд╣реИред

System.NotSupportedException: рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ 'Microsoft.AspNetCore.Mvc.SerializableError' рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдПрдХ рдЬреНрдЮрд╛рдд рдореБрджреНрджрд╛ рдерд╛ https://github.com/aspnet/AspNetCore/issues/11459 рдЬрд┐рд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 8 рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ): https://github.com/dotnet/corefx/pull/39001

рдЖрдкрдХреЗ рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж @ahsonkhan!

рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдиреЗ рдХреА рдХреБрдВрдЬреА рдХреА "рд╕реАрдорд╛" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИ рдЬрдм рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВред рдЕрдм рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ Json.net рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдиреЗ рдХреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЬреЗрд╕рди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдЗрд╕реЗ deserializing рдореБрдЭреЗ рдмрд╕ рдПрдХ int рд╡рд╛рдкрд╕ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЧреИрд░-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реЛрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╢реЛ рд╕реНрдЯреЙрдкрд░ рдирд╣реАрдВред

рдареАрдХ рд╣реИ, рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ Mvc.SerializableError рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 8 рдХреА рд░рд┐рд▓реАрдЬ рдХреА рддрд╛рд░реАрдЦ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдФрд░ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЦрд╛ред

рдПрдХ рдмрд╛рд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 8 рдЖрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо .net core 3 json рдХреНрд░рдорд╛рдВрдХрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ Json.net рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╣реЛрдЧрд╛

@steveharter , @layomia - рдХреНрдпрд╛ рдЗрд╕ рдмреАрдЪ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ? 5.0 рдХреЗ рд▓рд┐рдП рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рднреАрддрд░ рдЧреИрд░-рд╕реНрдЯреНрд░рд┐рдВрдЧ key'd рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧреЗрдЧрд╛?

>

@ahsonkhan @ willyt150 рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ JsonConverter<T> рдЬрд╣рд╛рдВ T Dictionary<int, string> ред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП https://github.com/dotnet/corefx/issues/36639#issue -429928740 рджреЗрдЦреЗрдВред

рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди 8 рдХреА рд░рд┐рд▓реАрдЬ рдХреА рддрд╛рд░реАрдЦ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдЗрд╕ рдорд╣реАрдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рджред

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

рдзрдиреНрдпрд╡рд╛рдж @layomia рдореИрдВ рдЙрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░

рдзрдиреНрдпрд╡рд╛рдж @ahsonkhan , рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕реБрдзрд╛рд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ!

@namse рд╕реЗ (https://github.com/dotnet/corefx/issues/40404 рд╕реЗ):

рдирдорд╕реНрддреЗред рдЬрдм рдореИрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ System.NotSupportedException рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬреЗрд╕рди рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ ToString -рд╕рдХреНрд╖рдо рдХреБрдВрдЬреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо int рдпрд╛ рдмреВрд▓рд┐рдпрди рдХреЗ рд▓рд┐рдП ToString рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ "123" рдпрд╛ "true" рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдВрдЬреА ToString -рд╕рдХреНрд╖рдо рдХреБрдВрдЬреА рд╣реИред

Verizon

System.Text.Json Nuget рд╕рдВрд╕реНрдХрд░рдг: 4.6.0-рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди8.19405.3

рдХреЛрдб

var dictionary = new Dictionary<int, string>
{
  [5] = "five"
};
JsonSerializer.Serialize(dictionary);

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реЛрдирд╛

"{"5": "five"}"

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ

рддреНрд░реБрдЯрд┐ System.NotSupportedException рдлреЗрдВрдХрд╛ рдЧрдпрд╛

рджрд░рдЕрд╕рд▓, рдЬрдм рдореИрдВ Newtonsoft.Json рдХреЛ System.Text.Json рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реВрдВ рддреЛ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрдореНрдореАрдж рдХреА рдереА, рд╡реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ System.Text.Json рдХреЛ рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди... рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ IDictionary<TKey, TValue> рд▓рд┐рдП рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдФрд░ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬреЗрд╢рди рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ TKey рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ TKey Parse(string) :

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace JsonDictionaryConverter
{
    sealed class JsonNonStringKeyDictionaryConverter<TKey, TValue> : JsonConverter<IDictionary<TKey, TValue>>
    {
        public override IDictionary<TKey, TValue> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            var convertedType = typeof(Dictionary<,>)
                .MakeGenericType(typeof(string), typeToConvert.GenericTypeArguments[1]);
            var value = JsonSerializer.Deserialize(ref reader, convertedType, options);
            var instance = (Dictionary<TKey, TValue>)Activator.CreateInstance(
                typeToConvert,
                BindingFlags.Instance | BindingFlags.Public,
                null,
                null,
                CultureInfo.CurrentCulture);
            var enumerator = (IEnumerator)convertedType.GetMethod("GetEnumerator")!.Invoke(value, null);
            var parse = typeof(TKey).GetMethod("Parse", 0, BindingFlags.Public | BindingFlags.Static, null, CallingConventions.Any, new[] { typeof(string) }, null);
            if (parse == null) throw new NotSupportedException($"{typeof(TKey)} as TKey in IDictionary<TKey, TValue> is not supported.");
            while (enumerator.MoveNext())
            {
                var element = (KeyValuePair<string?, TValue>)enumerator.Current;
                instance.Add((TKey)parse.Invoke(null, new[] { element.Key }), element.Value);
            }
            return instance;
        }

        public override void Write(Utf8JsonWriter writer, IDictionary<TKey, TValue> value, JsonSerializerOptions options)
        {
            var convertedDictionary = new Dictionary<string?, TValue>(value.Count);
            foreach (var (k, v) in value) convertedDictionary[k?.ToString()] = v;
            JsonSerializer.Serialize(writer, convertedDictionary, options);
            convertedDictionary.Clear();
        }
    }

    sealed class JsonNonStringKeyDictionaryConverterFactory : JsonConverterFactory
    {
        public override bool CanConvert(Type typeToConvert)
        {
            if (!typeToConvert.IsGenericType) return false;
            if (typeToConvert.GenericTypeArguments[0] == typeof(string)) return false;
            return typeToConvert.GetInterface("IDictionary") != null;
        }

        public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
        {
            var converterType = typeof(JsonNonStringKeyDictionaryConverter<,>)
                .MakeGenericType(typeToConvert.GenericTypeArguments[0], typeToConvert.GenericTypeArguments[1]);
            var converter = (JsonConverter)Activator.CreateInstance(
                converterType,
                BindingFlags.Instance | BindingFlags.Public,
                null,
                null,
                CultureInfo.CurrentCulture);
            return converter;
        }
    }
}

рдкрд░реАрдХреНрд╖рдг:

class Entity
{
    public string Value { get; set; }
}
class TestClass
{
    public Dictionary<int, Entity> IntKey { get; set; }
    public Dictionary<float, Entity> FloatKey { get; set; }
    public Dictionary<double, Entity> DoubleKey { get; set; }
    public Dictionary<DateTime, Entity> DateTimeKey { get; set; }
    public Dictionary<string, Entity> StringKey { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        var options = new JsonSerializerOptions();
        options.Converters.Add(new JsonNonStringKeyDictionaryConverterFactory());
        var x = new TestClass
        {
            IntKey = new Dictionary<int, Entity> { [1] = new Entity { Value = "test" } },
            FloatKey = new Dictionary<float, Entity> { [1.3f] = new Entity { Value = "test" } },
            DoubleKey = new Dictionary<double, Entity> { [1.35] = new Entity { Value = "test" } },
            DateTimeKey = new Dictionary<DateTime, Entity> { [DateTime.Now] = new Entity { Value = "test" } },
            StringKey = new Dictionary<string, Entity> { ["test"] = new Entity { Value = "test" } }
        };

        var value = JsonSerializer.Serialize(x, options);
        Console.WriteLine(value);
        var obj = JsonSerializer.Deserialize<TestClass>(value, options);
        Console.WriteLine(JsonSerializer.Serialize(obj, options));
    }
}

рдирддреАрдЬрд╛:

{"IntKey":{"1":{"Value":"test"}},"FloatKey":{"1.3":{"Value":"test"}},"DoubleKey":{"1.35":{"Value":"test"}},"DateTimeKey":{"8/25/2019 6:47:48 PM":{"Value":"test"}},"StringKey":{"test":{"Value":"test"}}}
{"IntKey":{"1":{"Value":"test"}},"FloatKey":{"1.3":{"Value":"test"}},"DoubleKey":{"1.35":{"Value":"test"}},"DateTimeKey":{"8/25/2019 6:47:48 PM":{"Value":"test"}},"StringKey":{"test":{"Value":"test"}}}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА Dictionary<int, Dictionary<int, int>> рдЬреИрд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ System.Text.Json рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ Dictionary<int, int> рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдбрд┐рдХреНрд╢рдирд░реА рдЬреИрд╕реЗ рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ> рдХреНрдпреЛрдВрдХрд┐ System.Text.Json рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ Dictionary. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред

v3.0 рдХреЗ рд▓рд┐рдП рд╢рд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЛрдк-рдХрдЯрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдХреЗрд╡рд▓ <string, x> рдХрд╛ рд╕рдорд░реНрдерди рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред 3.0 рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдиреНрдпреВрдирддрдо рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЙрддреНрдкрд╛рдж рд╣реЛрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВред

@steveharter рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрдирд╡рд░реНрдЯрд░ рд╣реЛрдиреЗ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЛ рдПрдХ рдЧреИрд░-рд╕рдорд░реНрдерди рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ .net core 3.1 рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди Newtonsoft.Json рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╣реИред

  1. Microsoft.AspNetCore.Mvc.NewtonsoftJson рдкреИрдХреЗрдЬ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗрдВред
  2. .AddNewtonsoftJson() рдХреЛ .AddControllers() / .AddMvc() рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдпреЛрдЬрди рдХреЗ рдареАрдХ рдмрд╛рдж рдЬреЛрдбрд╝реЗрдВред

@steveharter рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрдирд╡рд░реНрдЯрд░ рд╣реЛрдиреЗ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЛ рдПрдХ рдЧреИрд░-рд╕рдорд░реНрдерди рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рдБ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рд╣реИред рд╢рд╛рдпрдж рд╣рдо 3.1 рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реАрд╕реА @layomia

рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдЬ рд╢рдмреНрджрдХреЛрд╢ рддрддреНрд╡ рдЧреБрдгреЛрдВ рдХреА рддрд░рд╣ рдХреНрд░рдордмрджреНрдз рд╣реИрдВ рдЬреЛ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдВрдЬреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред рдЧреИрд░-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рддрддреНрд╡реЛрдВ рдХреЛ KeyValuePair рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдУрд╣ рдмреЙрдп, рдореБрдЭреЗ 3.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереАред

AddNewtonsoftJson рдХреЗ рд╕рд╛рде рдиреНрдпреВрдЯрди рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

https://github.com/dotnet/corefx/issues/41345 . рдореЗрдВ @israellot рд╕реЗ

var dictionary = new Dictionary<int, int>()
            {
                [0] = 1
            };

 var serialized = System.Text.Json.JsonSerializer.Serialize(dictionary);

рдпрд╣ рд╕рд░рд▓ рдХреНрд░рдорд╛рдВрдХрди рдкреВрд░реНрд╡ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдЬреЛрдВрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯ рдХреБрдВрдЬреА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдХреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред System.Text.Json рдкрд░ рдПрдХ рд╕рдорд░реНрдерд┐рдд рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИред

@israellot , @unruledboy , рдФрд░ рдереНрд░реЗрдб рдкрд░ рдЕрдиреНрдп, рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХреЛ рдЖрдкрдХреЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ Dictionary<string, TValue> рдмрджрд▓рдиреЗ рд╕реЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛? рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдлрд┐рдХреНрд╕ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рд╡реЗ рд╡реИрд╕реЗ рднреА рддрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдХрд┐рд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ int32 рдХреБрдВрдЬреА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@ahsonkhan рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рд╕рдВрдЧрддрддрд╛ рд╣реИред
рдкрд┐рдЫрд▓рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдордирдорд╛рдиреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдФрд░ deserialize рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реЗ рдореЙрдбрд▓ рд▓рд┐рдЦреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред 2.X рд╕реЗ 3.0 рдкрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЕрдм рдПрдХ рдореВрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЕрд╕рдВрдЧрддрд┐ рдХреЛ рдЬрд╛рдиреЗрдВрдЧреЗред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рддрд╛рд░ рдХреЗ рдкрд╛рд░ рдкрд░рд┐рд╡рд╣рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╕рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЛрдореЗрди рдореЙрдбрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Dictionary. рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рдПрдХ рдЕрд▓рдЧ рдбреАрдЯреАрдУ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдХреНрд╢рдирд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддрд╛ рд╣реИрдФрд░ рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛, рдмрд▓реНрдХрд┐ рдЕрдХреНрд╖рдо рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдореЗрдВ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рд╕рдЦреНрддреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЗрд╕рди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдШрд░реНрд╖рдг рджреВрд░ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

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

{
  "parts" : {
    "1" : "alpha",
    "3" : "beta"
  }
}

рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЗрд╕рди рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ Dictionary<int, string> deserialized рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред System.Text.Json рдХреНрд░рдорд╛рдВрдХрди рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдлрд▓ рд░рд╣рд╛ред

рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ DictionaryConverter , рдФрд░ DictionaryConverter рдмрдирд╛рдХрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ .
рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдирд╡рд░реНрдЯрд░ рднреА рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЕрдХреНрд░рдорд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдлрд┐рд░ рдЗрдиреНрд╣реЗрдВ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/Kieranties/SimpleVersion/blob/master/src/SimpleVersion.Core/Serialization/Serializer.cs#L22

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

рдореИрдВрдиреЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХрд╛рд╕ рдХреЗ рднреАрддрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

3.1 рдХреЗ рд▓рд┐рдП рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд┐рд╕реА рдкреНрд░рддрд┐рдмрдВрдз рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TKey рдХреЗ рд▓рд┐рдП Dictionary<TKey,TValue> ред

рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдРрд╕реЗ рдирдореВрдиреЗ рдЬреЛрдбрд╝реЗ рд╣реИрдВ рдЬреЛ 3.0 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдиреЗрд╕реНрдЯреЗрдб рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдЬреИрд╕реЗ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдирдореВрдиреЗ рдореЗрдВ рджреЛ JSON рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде JSON рдСрдмреНрдЬреЗрдХреНрдЯ: {"1":"val1","2":"val2"} рднрд▓реЗ рд╣реА TKey рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред

    • рдпреЗ рд╕рдВрдЧрдд рд╕рдорд░реНрдерд┐рдд рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдкрд░ TryParse рдкрджреНрдзрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред V3.0 рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд TKey рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ TryParse рддрд░реАрдХреЗ рдХрд┐рд╕реА рднреА TKey рд▓рд┐рдП рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реА рд╕рдВрд╕реНрдХреГрддрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп)ред рддреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдирдореВрдиреЗ рдПрдХрд▓ TKey рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИрдВред

    • Sample Dictionary<int, string> ред рдпрд╣ рдХреЗрд╡рд▓ TValue == string рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред

    • Sample Dictionary<Guid, TValue> ред рдпрд╣ рдХрд┐рд╕реА рднреА TValue рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

    • Sample Dictionary<TKey, TValue> where TKey is Enum ред Enums рдХреЗ рд▓рд┐рдП; рдпрд╣ рдХрд┐рд╕реА рднреА TValue рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

  • KeyValuePair рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде JSON рд╕рд░рдгреА: [{"Key":1,"Value":"val1"},{"Key":2,"Value":"val2"}]

    • Sample Dictionary<int, string> ред рдпрд╣ рдХреЗрд╡рд▓ TValue == string рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред

    • Sample Dictionary<TKey, TValue> ред рдпрд╣ рдХрд┐рд╕реА рднреА TKey рдФрд░ TValue рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ JSON рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ TryParse рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

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

рдорд╛рдЗрд▓рд╕реНрдЯреЛрди рдХреЛ 5.0 рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рдирд╛ (рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЕрдХреНрд░рдорд╛рдВрдХрди рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп (рдЖрджрд┐рдо?) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп JsonDocument рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

string test = "[{\"id\":86,\"name\":\"test\"}]";
var SystemTextJson = System.Text.Json.JsonSerializer.Deserialize<List<Dictionary<string, object>>>(test);
var NewtonSoftJson = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(test);

SystemTextJson [0] ["id"] рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ: ValueKind = рд╕рдВрдЦреНрдпрд╛: "86"
рдиреНрдпреВрдЯрди рд╕реЙрдлреНрдЯрдЬрд╕рди [0] ["рдЖрдИрдбреА"] рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ: 86

@steveharter рдЙрд╕ рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ
{ "Stuff": [ { "Key": 1, "Value": "String" }, { "Key": 3, "Value": "String" }, { "Key": 2, "Value": "String" } ] }

рдЬрдмрдХрд┐ JSON.NET рд╡рд╣ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ:
{ "Stuff": { "Item1": "String", "Item2": "String", "Item3": "String" }

рдЕрдХреНрд░рдорд╛рдВрдХрди рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп (рдЖрджрд┐рдо?) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп JsonDocument рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рд╣рд╛рдБ рд╡рд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред рджреЗрдЦреЗрдВ https://github.com/dotnet/corefx/issues/38713

@steveharter рдЙрд╕ рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ
{"рд╕рд╛рдорд╛рди": [{"рдХреБрдВрдЬреА": 1, "рдорд╛рди": "рд╕реНрдЯреНрд░рд┐рдВрдЧ"}, {"рдХреБрдВрдЬреА": 3, "рдорд╛рди": "рд╕реНрдЯреНрд░рд┐рдВрдЧ"}, {"рдХреБрдВрдЬреА": 2, "рдорд╛рди": " рдбреЛрд░реА" } ] }
рдЬрдмрдХрд┐ JSON.NET рд╡рд╣ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ:
{ "рд╕рд╛рдорд╛рди": { "рдЖрдЗрдЯрдо 1": "рд╕реНрдЯреНрд░рд┐рдВрдЧ", "рдЖрдЗрдЯрдо 2": "рд╕реНрдЯреНрд░рд┐рдВрдЧ", "рдЖрдЗрдЯрдо 3": "рд╕реНрдЯреНрд░рд┐рдВрдЧ"}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк "рдирдореВрдирд╛ рд╢рдмреНрджрдХреЛрд╢" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ"? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рд╛рдБ, рдЬрд┐рд╕рдореЗрдВ KeyValuePair рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ "рдХреБрдВрдЬреА" рдФрд░ "рдорд╛рди" рдЧреБрдг рд╣реИрдВред рдореИрдВрдиреЗ TKey- рдЖрдзрд╛рд░рд┐рдд рдПрдирдо рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред

рд╣рд╛рдБ, рд╡рд╣реАред рдФрд░ рдЖрд╣ рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджрдХреЛрд╢ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВред
рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХрд╛ рдирдпрд╛ рдирдореВрдирд╛ рджреЗрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдЬрд┐рд╕ рдирдореВрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЙрддрдирд╛ рддреЗрдЬрд╝ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдЬрд┐рддрдирд╛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

@roguecode рдпрд╣рд╛рдВ Dictionary<TKey, TValue> рд▓рд┐рдП рдПрдХ Enum рдирдореВрдирд╛ рд╣реИ рдЬрд╣рд╛рдВ TKey рдПрдХ Enum рд╣реИ рдФрд░ KeyValuePair рдХреЗ рдмрдЬрд╛рдп "рд╕рдВрдкрддреНрддрд┐" JSON рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдирдП рдирдореВрдиреЗ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдирдореВрдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред

рд╣реИрд▓реЛ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рдорд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдФрд░ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИред

рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ.рдЬреЗрд╕рди: 12.0.2
Microsoft.AspNetCore.Mvc.NewtonsoftJson: 3.0.0

рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк 3.0 рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:

                .AddMvc(mvcOptions => mvcOptions.EnableEndpointRouting = false)
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .AddNewtonsoftJson();

рдЕрдЧрд░ рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рддреЛ рд╡рд┐рд╡рд░рдг рд╡рд╕реНрддреБ:

// problemDetails has 2 extension items
{Microsoft.AspNetCore.Mvc.ValidationProblemDetails}
    Detail: "Please refer to the 'errors' property for additional details."
    Errors: Count = 1
    Extensions: Count = 2
    Instance: "/api/test/complex-binding-from-query"
    Status: 400
    Title: "One or more validation errors occurred."
    Type: "https://tools.ietf.org/html/rfc7231#section-6.5.1"

2.2 рдореЗрдВ, Newtonsoft.Json.JsonConvert.SerializeObject(problemDetails) рд░рд┐рдЯрд░реНрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛

{"errors":{"Int":["The value 'a' is not valid for Int."]},"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"detail":"Please refer to the 'errors' property for additional details.","instance":"/api/test/complex-binding-from-query","traceId":"0HLQQ40AFBJNG","correlationId":"0HLQQ40AFBJNG"}

3.0 рдореЗрдВ рдпрд╣ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

{"Errors":{"param":["The value 'a' is not valid."]},"Type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","Title":"One or more validation errors occurred.","Status":400,"Detail":"Please refer to the 'errors' property for additional details.","Instance":"/bad-request","Extensions":{"traceId":"|d0d40f80-48b6c9184401b0e1.","correlationId":"0HLQR10NSMRGD:00000009"}}

3.0 рд╕рдВрд╕реНрдХрд░рдг рдХреНрд░рдордмрджреНрдз рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ IDictionary рд╢рд╛рдорд┐рд▓ рд╣реИрд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо, Extensions , рдФрд░ рд╣рдо 3.0 рдореЗрдВ рдЙрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ deserialize рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧреБрдг рдирд╛рдо 2.x рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЫреВрдЯ рдЧрдпрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ 3.0 рдХреНрд░рдорд╛рдВрдХрди рдЬреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдлрд┐рд▓реНрдЯрд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ BadRequestObjectResult , рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ:

public sealed class ProblemDetailsResultFilterAttribute : Attribute, IAlwaysRunResultFilter
{
        public void OnResultExecuting(ResultExecutingContext context)
        {
             context.Result = new BadRequestObjectResult(problemDetails);
        }
}

..., рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА рд▓реМрдЯрд╛рдИ рдЬрд╛рддреА рд╣реИ рд╡рд╣ 2.2 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд░реВрдк рд╣реИ ( Extensions рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ), рдЬреЛ Extensions рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЦрд╛рд▓реА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ deserialize рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ (рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) Newtonsoft.Json.JsonConvert.DeserializeObject<ValidationProblemDetails>() )

рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдХреНрд░рдорд╛рдВрдХрди рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рдорд╛рди рдХреНрд░рдорд╛рдВрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо deserialize рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╣реИ

@ ts46235 рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЕрдВрдХ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджреЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИ?

@ ts46235 рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдЦреЛрд▓реЗ рдЧрдП рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ - https://github.com/aspnet/AspNetCore/issues/16618ред рдпрд╣рд╛рдВ рдмрд╛рддрдЪреАрдд рдХреЛ рд╡рд┐рд╖рдп рд╕реЗ рдмрд╛рд╣рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреЛрд░ 3.1 рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЕрднреА рднреА рддрдп рдирд╣реАрдВ рд╣реИ

рдореИрдВрдиреЗ рдЕрднреА 3.1 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖ рд╣реВрдВред JSON.NET рдкрд░ рд╡рд╛рдкрд╕ рдореИрдВ рдЬрд╛рддрд╛ рд╣реВрдВ... (рдореИрдВ GUID рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)

рдбреЙрдЯ рдиреЗрдЯ рдХреЛрд░ 3.1
рд╢рдмреНрджрдХреЛрд╢рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреБрдВрдЬреА рдореЗрдВ рд╡рд╕реНрддреБ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ

рдореИрдВрдиреЗ рднреА рдЗрд╕реЗ рдЕрднреА рдорд╛рд░рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐рддрдиреА рдбрд░рд╛рд╡рдиреА рдореВрдХ рд╕реАрдорд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдмрддрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ Dictionary<int, List<string>> рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рджреЗрд╢реА рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рд░рддрд╛ рд╣реИред

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реА # рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрд╕рд╛рди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдордЬрдмреВрд░ рд╣реИред рддреЛ рдмрд╕ рдЙрджрд╛рд╕ рд╣реВрдБ..

рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ:

   [JsonConverter(typeof(DictionaryConverter))]
   public Dictionary<string, object> ExtraProperties { get; set; } = new Dictionary<string, object>();
public class DictionaryConverter : JsonConverter<Dictionary<string, object>>
{
    public override Dictionary<string, object> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var dictionary = JsonSerializer.Deserialize<Dictionary<string, object>>(ref reader, options);

        foreach (string key in dictionary.Keys.ToList())
        {
            if (dictionary[key] is JsonElement je)
            {
                dictionary[key] = Unwrap(je);
            }
        }

        return dictionary;
    }

    public override void Write(Utf8JsonWriter writer, Dictionary<string, object> value, JsonSerializerOptions options)
        => JsonSerializer.Serialize(writer, value, options);

    private static object Unwrap(JsonElement je)
    {
        return je.ValueKind switch
        {
            JsonValueKind.String => je.ToString(),
            JsonValueKind.Number => je.TryGetInt64(out var l) ? l : je.GetDouble(),
            JsonValueKind.True => true,
            JsonValueKind.False => false,
            JsonValueKind.Array => je.EnumerateArray().Select(Unwrap).ToList(),
            JsonValueKind.Object => je.EnumerateObject().ToDictionary(x => x.Name, x => Unwrap(x.Value)),
            _ => null
        };
    }

рд╢рд╛рдпрдж (рдХреБрдЫ) рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдУрдУрдЯреАрдмреА рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реВрдЪреА , рдФрд░ рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ .IsAssignableFrom(systemDotObjectInstance.GetType()) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Dictionary<<ins i="7">object</ins>, V> ред

рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ рдЧреИрд░-рд╕реНрдЯреНрд░рд┐рдВрдЧ TKey рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
https://github.com/dotnet/runtime/pull/32676

рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдпрд╛ рдЪрд┐рдВрддрд╛ рдмрддрд╛рдПрдВред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреГрдкрдпрд╛ рдбрд┐рдХреНрд╢рдирд░реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП @Jozkee рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдореВрд▓ рд░реВрдк рд╕реЗ, рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрджрд┐рдо рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░, рдПрдирдо, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп):
https://github.com/dotnet/runtime/blob/a5d96c0e280b56412d4614848f5ee3b1e0d7f216/src/libraries/System.Text.Json/docs/KeyConverter_spec.md#keyconverter

рд╢рдмреНрджрдХреЛрд╢рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреБрдВрдЬреА рдореЗрдВ рд╡рд╕реНрддреБ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ

@ рдПрдВрдбреНрд░рдпреВ-рд╡реАрдбреАрдмреА, рдордирдорд╛рдиреА рд╡рд╕реНрддреБ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрд╕рдорд░реНрдерд┐рдд рд░рд╣реЗрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ "рдирдП рд╕рдорд░реНрдерд┐рдд" рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рддреЛ рд╕реБрд╡рд┐рдзрд╛ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрд░рдорд╛рдВрдХрди рдЙрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЕрдХреНрд░рдорд╛рдВрдХрди, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмреЙрдХреНрд╕рд┐рдВрдЧ JsonElement рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣реЗрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ): https://github.com/dotnet/runtime/issues/29960

@Jozkee TValue рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕рдХреНрд╖рдо рд╣реИрдВ? рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдЬреЛ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдЬреЛ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рд╛рдВред

рдЕрдХреНрд░рдорд╛рдВрдХрди рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп (рдЖрджрд┐рдо?) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп JsonDocument рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

string test = "[{\"id\":86,\"name\":\"test\"}]";
var SystemTextJson = System.Text.Json.JsonSerializer.Deserialize<List<Dictionary<string, object>>>(test);
var NewtonSoftJson = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(test);

SystemTextJson [0] ["id"] рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ: ValueKind = рд╕рдВрдЦреНрдпрд╛: "86"
рдиреНрдпреВрдЯрди рд╕реЙрдлреНрдЯрдЬрд╕рди [0] ["рдЖрдИрдбреА"] рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ: 86

рд╕рднреА рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред рд╕реВрдЪреАрдпрд╛ рдЯреА[] рдпрд╛ рдбрд┐рдХреНрд╢рдирд░реАрдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ deserialize рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рд╕реАрдзреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛрд╕рди рдХреЛ рд╕реАрдПрд▓рдЖрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╣реИред

3.0 рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдиреНрдпреВрдирддрдо рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЙрддреНрдкрд╛рдж рд╣реЛрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреИрд╕реЗ List> рд╕рдмрд╕реЗ рдЖрдо рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ:

[// N objects
{"a":4},
{"b","Bla"},
]

рдЪреВрдВрдХрд┐ рдпрд╣ System.Text.JsonElement рдореЗрдВ рднреА deserialize рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдореИрдВ рдбрдмрд▓ (рд╕рдВрдЦреНрдпрд╛) рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ

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

{
  "parts" : {
    "1" : "alpha",
    "3" : "beta"
  }
}

рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЗрд╕рди рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ Dictionary<int, string> deserialized рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред System.Text.Json рдХреНрд░рдорд╛рдВрдХрди рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдлрд▓ рд░рд╣рд╛ред

рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ DictionaryConverter , рдФрд░ DictionaryConverter рдмрдирд╛рдХрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ .
рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдирд╡рд░реНрдЯрд░ рднреА рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЕрдХреНрд░рдорд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдлрд┐рд░ рдЗрдиреНрд╣реЗрдВ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/Kieranties/SimpleVersion/blob/feature/netcore3/src/SimpleVersion.Core/Serialization/Serializer.cs#L20

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

рдореИрдВрдиреЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХрд╛рд╕ рдХреЗ рднреАрддрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрд░реЗ @Kieranties , github рдореЗрд░реЗ рд▓рд┐рдП 404 рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ

рдЕрд░реЗ @Kieranties , github рдореЗрд░реЗ рд▓рд┐рдП 404 рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ

@AirEssY рдореИрдВрдиреЗ рдЕрдкрдиреА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд▓рд┐рдВрдХ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╣реИрдВ: https://github.com/Kieranties/SimpleVersion/tree/master/src/SimpleVersion.Core/Serialization

рдпрджрд┐ рдбрд┐рдХреНрд╢рдирд░реА рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдХреЛрдИ рднреА (рдЬреЗрдПрд╕ рдкреНрд░рдХрд╛рд░ рд╕реА # рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП,

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

A Map's keys can be any value (including functions, objects, or any primitive).

JS рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЕрдХреНрд░рдорд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

const countries = new Map(JSON.parse('[[1,"Bahamas (the)"],[2,"Bolivia (Plurinational State of)"]]'))

console.log(countries)

рдЬреЛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:

Map(2) {
  1 => 'Bahamas (the)',
  2 => 'Bolivia (Plurinational State of)'
}

рдЯреАрдПрд▓; рдбреАрдЖрд░: рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓рддрд╛ рд╣реИ

@Jozkee рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ .NET 5 рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдпрд╣ 3.* рдореЗрдВ рдЬрд╛рдПрдЧрд╛?

@onionhammer .NET 5.0, рдЖрдк рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрдЧрд▓реЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди (5.0 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди8) рдореЗрдВ рднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕реЗ 3.x рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред

рдПрдПрд╕рдкреА рдиреЗрдЯ рдХреЛрд░ 3.x рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди:

var dic1 = new Dictionary<TKey, TValue>(); 
return Json(new { dic1 }); // does not work

var dic2 = from i in new Dictionary<TKey, TValue>() select new { i.Key, i.Value }
return Json(new { dic2 });  //works prety well

@verloka рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рд╣реИ

@Jozkee рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ .NET 5 рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдпрд╣ 3.* рдореЗрдВ рдЬрд╛рдПрдЧрд╛?

рдЗрд╕реЗ 3.x рдкрд░ рдмреИрдХрдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк .NET 5 рдореЗрдВ рд╕рднреА рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ System.Text.Json NuGet рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

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

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

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

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

matty-hall picture matty-hall  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ