Runtime: рд╕рдорд░реНрдерди "рдЧрддрд┐рд╢реАрд▓" рдФрд░ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдбреЛрдо

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдордИ 2019  ┬╖  47рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

рдХреНрдпрд╛ JsonSerializer.Parse(String, Type, JsonSerializerOptions) рдбрд╛рдпрдирд╛рдорд┐рдХ ExpandoObject рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
dynamic p = JsonSerializer.Parse(json, typeof(ExpandoObject));

area-System.Text.Json enhancement json-functionality-doc

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

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рднреА рд╣реИ - рдореИрдВ рд╕рд┐рд░реНрдл рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд░рдИрдПрд╕рдЯреА рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд░реНрдЧ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ ... JSON.NET рдХреЗ рд╕рд╛рде рдореИрдВ рдХреЗрд╡рд▓ "рдЧрддрд┐рд╢реАрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкрд╕рдВрдж рдХреА рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред

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

рдирд╣реАрдВ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЗрд╕ рд╕рдордп рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдореЗрдВ vNext рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рд╣реИ?

рднрд╡рд┐рд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ред

System.NotSupportedException : The collection type 'System.Dynamic.ExpandoObject' is not supported.

@ahsonkhan GraphQL рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдпреБрдХреНрддрд┐ JSON рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддреА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░рдорд╛рдВрдХрди рд╕реЗ рдмрдВрдзреА рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ "рдбреЗрдЯрд╛" рдХреНрд╖реЗрддреНрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╣реИ: рдЧрддрд┐рд╢реАрд▓ред рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
ExpandoObject рдХреЗ рдмрд┐рдирд╛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдбрд╛рдпрдиреЗрдорд┐рдХ рдХреЛ JSON рдореЗрдХрд┐рдВрдЧ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред рддреЛ рдЙрд╕ рдЕрдореВрд░реНрдд рдЧрддрд┐рд╢реАрд▓ "рдбреЗрдЯрд╛" рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдПрдХ JToken рд╣реИред

ExpandoObject рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдХреА рддрд░рд╣ рдЧрддрд┐рд╢реАрд▓ "рдбреЗрдЯрд╛" рдХреА рдкрд╣реБрдВрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@ahsonkhan рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрд╡рд╛ рд╣реИред рдпрд╣ рдЖрд░рдИрдПрд╕рдЯреА рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдЬреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореЛрдВрдЧреЛрдбреАрдмреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдбрдореА рдЖрд░рдИрдПрд╕рдЯреА рд░реИрдкрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдмрд╛рдХреА рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдореЛрдВрдЧреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдЯреАрдХ 1-1 рдореИрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХрд╛ рднреА рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ)ред

рддреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдореЗрдВ рдЧрддрд┐рд╢реАрд▓/ExpandoObject рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдо рдЗрд╕реЗ рдЕрдиреНрдп рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рднреА рдЗрд╕ рд╕реАрдорд╛ рдореЗрдВ рднрд╛рдЧреЗред рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдзреАрд░реЗ-рдзреАрд░реЗ рдЬреЗрд╕рди рдХреНрд░рдорд╛рдВрдХрди рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдзрд┐рдХ рдкрд░рд┐рдкрдХреНрд╡ Json.NET рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдкрд░ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЧрдпрд╛ред

рд╣реЗ рд▓реЛрдЧреЛрдВ

рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдШреВрдордирд╛ рд╣реИ?
рдХреНрдпрд╛ рдореИрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ?
@SidShetye рдЖрдкрдиреЗ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

@MickeyReznikov : рджреЗрдЦреЗрдВ https://stackoverflow.com/questions/15455304/deserialize-a-property-as-an-expandoobject-use-json-net рдпрд╛ google "json.netexpandoobject"

@MickeyReznikov , рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ @SidShetye рдХрд╛ рдорддрд▓рдм рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Newtonsoft.Json рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрди-рдмреЙрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (System.Text.Json) рдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдПрдПрд╕рдкреАрдиреЗрдЯ рдРрдкреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ AddNewtonsoftJson рдмреИрдХ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреЗрдЦреЗрдВ https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#jsonnet -support

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рднреА рд╣реИ - рдореИрдВ рд╕рд┐рд░реНрдл рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд░рдИрдПрд╕рдЯреА рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд░реНрдЧ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ ... JSON.NET рдХреЗ рд╕рд╛рде рдореИрдВ рдХреЗрд╡рд▓ "рдЧрддрд┐рд╢реАрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкрд╕рдВрдж рдХреА рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред

https://github.com/dotnet/corefx/issues/41472 рджреНрд╡рд╛рд░рд╛ @ghost1372 рд╕реЗ :

рдирдорд╕реНрддреЗ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ deserialize рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

var objList = System.Text.Json.JsonSerializer.Deserialize<List<dynamic>>(json);

рд╣рдорд╛рд░реЗ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╣рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪреА рдФрд░ рдЦреЛрдЬ рд╕реВрдЪреА рдкреГрд╖реНрдареЛрдВ рдХреЛ jquery.jtable рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ

JsonSerializer рдХреЗ рдмрд┐рдирд╛ ExpandoObject рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рд╣рдо dotnet рдХреЛрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд Json Serialization рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╣рдо рдЙрд╕реА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА @estiler рдФрд░ @SidShetye рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЗрд╕ рдмреАрдЪ рд╣рдореЗрдВ рд╡рд╛рдкрд╕ Json.NET рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рдХреНрдпрд╛ рднрд╡рд┐рд╖реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ _now_ рдХреЗ рдХрд░реАрдм рдПрдХ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдореИрдВ

ExpandoObject рдХрд╛рдлреА рд╕рдордп рд╕реЗ BCL рдореЗрдВ рд╣реИ

рдХреНрдпрд╛ ExpandoObject рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИ?

@fatihyildizhan рдирд╣реАрдВ, рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ ExpandoObject рдХрдиреНрд╡рд░реНрдЯрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдЖрдк рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рд╕рдВрдХреЗрдд рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ ASP.NET Core 3.0: Custom JsonConverter рдирдП System.Text.Json рдХреЗ рд▓рд┐рдП

рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреНрд░рдорд╛рдВрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдХреНрд░рдорд╛рдВрдХрди рдмрдирд╛рддреЗ рд╣реИрдВ

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдЗрд╕реЗ 5.0 рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ред

5.0 рдкрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ? рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд╛рд▓ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛? JSON.Net рдкрд░ рд╡рд╛рдкрд╕ рдпрд╣ рд╣реИред

5.0? рд╡рд╛рд╣, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИред

рдЕрд╕реНрдерд╛рдпреА рдмрджрд╕реВрд░рдд рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд╕рд╛рде JsonDocument рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ IDISposable рд╣реИред

public sealed class EventObject
    {
        [JsonPropertyName("id")]
        public long Id
        {
            get; set;
        }

        [JsonPropertyName("eventData")]
        [JsonConverter(typeof(JsonDocumentConverter))]
        public System.Text.Json.JsonDocument EventData
        {
            get; set;
        }
    }

    internal sealed class JsonDocumentConverter
        : JsonConverter<System.Text.Json.JsonDocument>
    {
        public override JsonDocument Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            return JsonDocument.ParseValue(ref reader);
        }

        public override void Write(Utf8JsonWriter writer, JsonDocument value, JsonSerializerOptions options)
        {
            value.WriteTo(writer);
        }
    }

рдЕрдм рд╣рдо System.Text.Json рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд POST рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ:

[HttpPost]
public async Task<IActionResult> SubmitAsync(dynamic model)

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд▓реЗрдХрд┐рди рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдмреИрдХрдПрдВрдб рдХреЛрдб рдореЗрдВ 'рдореЙрдбрд▓' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реАрдзрд╛ рдЖрдЧреЗ рдирд╣реАрдВ рдерд╛:

[HttpPost]
public async Task<IActionResult> SubmitAsync(JsonElement model)

'рдореЙрдбрд▓' рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдФрд░/рдпрд╛ рдЕрдиреНрдп рдиреЗрд╕реНрдЯреЗрдб рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред dynamic рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ JsonElement рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ model.GetRawText() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдиреЗ рдЗрд╕реЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреАрдХреЛрдб рдХрд┐рдпрд╛ред рдпрд╣ рддрд░реАрдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ Newtonsoft.json рдХреЛ рд╣рдЯрд╛рдирд╛ рдерд╛ред

рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдЯрд┐рдХрдЯ/рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╣рдорд╛рд░реА рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдпрд╣ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЬрд░реВрд░реА рдореБрджреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЗрд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

/рд╕реАрд╕реА @ahsonkhan @terrajobst

.NET рдХреЛрд░ 3.0 JsonSerializer. рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП Deserialize

ExpandoObject рдХреЗ рд▓рд┐рдП JsonSerializer рд╕рдорд░реНрдерди (рдЕрдВрддрд░рд┐рдо рдЙрдкрд╛рдп)
рдореИрдВ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдВ, рдХрдИ рдЬрдЧрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИрдВ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
.net Core3 рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ

рдЬреЗрд╕рди рдХрдиреНрд╡рд░реНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝реЗрдВ:

  • System.Text.Json рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;
  • System.Text.Json.Serialization рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;

```рд╕реА#
///


/// рдЕрд╕реНрдерд╛рдпреА рдЧрддрд┐рд╢реАрд▓ рдХрдирд╡рд░реНрдЯрд░
/// рджреНрд╡рд╛рд░рд╛:[email protected]
///

рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдбрд╛рдпрдиреЗрдорд┐рдХрдЬрд╕рди рдХрдиреНрд╡рд░реНрдЯрд░: JsonConverter
{
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рдЧрддрд┐рд╢реАрд▓ рдкрдврд╝реЗрдВ (рд╕рдВрджрд░реНрдн Utf8JsonReader рдкрд╛рдардХ,
рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдЯреВ рдХрдиреНрд╡рд░реНрдЯ,
JsonSerializerOptions рд╡рд┐рдХрд▓реНрдк)
{

        if (reader.TokenType == JsonTokenType.True)
        {
            return true;
        }

        if (reader.TokenType == JsonTokenType.False)
        {
            return false;
        }

        if (reader.TokenType == JsonTokenType.Number)
        {
            if (reader.TryGetInt64(out long l))
            {
                return l;
            }

            return reader.GetDouble();
        }

        if (reader.TokenType == JsonTokenType.String)
        {
            if (reader.TryGetDateTime(out DateTime datetime))
            {
                return datetime;
            }

            return reader.GetString();
        }

        if (reader.TokenType == JsonTokenType.StartObject)
        {
            using JsonDocument documentV = JsonDocument.ParseValue(ref reader);
            return ReadObject(documentV.RootElement);
        }
        // Use JsonElement as fallback.
        // Newtonsoft uses JArray or JObject.
        JsonDocument document = JsonDocument.ParseValue(ref reader);
        return document.RootElement.Clone();
    }

    private object ReadObject(JsonElement jsonElement)
    {
        IDictionary<string, object> expandoObject = new ExpandoObject();
        foreach (var obj in jsonElement.EnumerateObject())
        {
            var k = obj.Name;
            var value = ReadValue(obj.Value);
            expandoObject[k] = value;
        }
        return expandoObject;
    }
    private object? ReadValue(JsonElement jsonElement)
    {
        object? result = null;
        switch (jsonElement.ValueKind)
        {
            case JsonValueKind.Object:
                result = ReadObject(jsonElement);
                break;
            case JsonValueKind.Array:
                result = ReadList(jsonElement);
                break;
            case JsonValueKind.String:
                //TODO: Missing Datetime&Bytes Convert
                result = jsonElement.GetString();
                break;
            case JsonValueKind.Number:
                //TODO: more num type
                result = 0;
                if (jsonElement.TryGetInt64(out long l))
                {
                    result = l;
                }
                break;
            case JsonValueKind.True:
                result = true;
                break;
            case JsonValueKind.False:
                result = false;
                break;
            case JsonValueKind.Undefined:
            case JsonValueKind.Null:
                result = null;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
        return result;
    }

    private object? ReadList(JsonElement jsonElement)
    {
        IList<object?> list = new List<object?>();
        foreach (var item in jsonElement.EnumerateArray())
        {
            list.Add(ReadValue(item));
        }
        return list.Count == 0 ? null : list;
    }
    public override void Write(Utf8JsonWriter writer,
        object value,
        JsonSerializerOptions options)
    {
       // writer.WriteStringValue(value.ToString());
    }
}
## How to Use?

```C#
var serializerOptions = new JsonSerializerOptions
{
    Converters = { new DynamicJsonConverter() }
};
return JsonSerializer.Deserialize<dynamic>("{OK:"200"}", serializerOptions);

@tchivs , рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛; рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рдерд╛:
c# var serializerOptions = new JsonSerializerOptions(); serializerOptions.Converters.Add(new DynamicJsonConverter()); return JsonSerializer.Deserialize<dynamic>("{OK:"200"}", serializerOptions);

JsonElement рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

public JsonElement MyProperty {get; set;}

@tchivs , рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕рдВрд╢реЛрдзрди рдХрд┐рдП рд╣реИрдВ - рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рддрд╛рдХрд┐ рдпрд╣ ExpandoObject рдХреЗ рдмрдЬрд╛рдп рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП "рдкреНрд░реЛрдЬреЗрдХреНрд╢рди" рдкреНрд░рдХрд╛рд░реЛрдВ (рдмреЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╕рдмрд╕реЗрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдХреЛрдб (рдирдореВрдирд╛ рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ) рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ: EDennis.DynamicDeserialization ред

рдореИрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рддрд╣рдд рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реВрдВрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореМрдЬреВрджрд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдИрдПрдл рдХреЛрд░ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ deserialization; рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЗрд╕рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рд╕рд░рдгреА рдХрд╛ deserialization)ред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рджреЗрдЦрддреЗ рд╣реИрдВред

рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ Microsoft рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдПрдХ рдЙрдЪрд┐рдд рд╕рдордп рд╕реАрдорд╛ рдореЗрдВ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИред рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреЗ рдмрд┐рдирд╛ рдЧреНрд░рд╛рдлрд╝рдХреНрдпреВрдПрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд░реНрдмреЛрдЬрд╝ рдФрд░ рдмрджрд╕реВрд░рдд рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВред рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдЧреБрдгреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдзрд╛рдЧреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ deserialization рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рдПрдХ рдРрд╕реЗ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдХреНрд░рдорд┐рдХрд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪреБрдкрдЪрд╛рдк "рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ"ред рдЕрдкрдиреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреНрдпреВрдирддрдо рд░реЗрдкреНрд░реЛ рдХреЗ рд╕рд╛рде рдЖрдпрд╛:

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Text.Json;

namespace SampleConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic d = new CustomDynamicObject();
            d.AProperty = 10;
            var s = JsonSerializer.Serialize(d);

            Console.WriteLine(s);
            Console.Read();
        }
    }

    class CustomDynamicObject : DynamicObject 
    {
        private readonly IDictionary<string, object> properties = new Dictionary<string, object>();

        public override bool TryGetMember(GetMemberBinder binder, out object result) => properties.TryGetValue(binder.Name, out result);

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            properties[binder.Name] = value;
            return true;
        }

        public override IEnumerable<string> GetDynamicMemberNames()
        {
            foreach (var item in properties.Keys)
            {
                yield return item;
            }
        }
    }
}

рдЬрдм s рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ {} , рдЗрд╕рд▓рд┐рдП рдХреНрд░рдордмрджреНрдзрддрд╛ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рдЦрд╛рд▓реА рдЬреЗрд╕рди рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдореБрджреНрджрд╛ рд╣реИ? рдпрд╛ рдореБрдЭреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдЙрдард╛рдирд╛/рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдореБрджреНрджрд╛ рд╣реИ? рдпрд╛ рдореБрдЭреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдЙрдард╛рдирд╛/рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдпрд╣ рд╕рд╣реА рдореБрджреНрджрд╛ рд╣реИред рдПрдХ рд╣реА рдлреАрдЪрд░ рдХреЗ рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдореБрджреНрджрд╛ рдПрдХреНрд╕рдкреЗрдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреНрд░рдордмрджреНрдз рдФрд░ deserialize)ред

рдореИрдВ рдЖрдЬ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдорд┐рд▓рд╛ рд╣реВрдВ - рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ JsonElement рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдпрд╣ рдирд┐рдкрдЯрд╛рдП рдЧрдП JsonDocument рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИред рдПрдХ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ JsonDocument рд▓рд┐рдП рдПрдХ рд╡рд┐рдирд╛рд╢рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдирд┐рдкрдЯрд╛рди рдмрд╛рдж рдХреЗ рд╕рдордп рдореЗрдВ рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдмрд╛рд░ рд╕рднреА JsonElement рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред
JsonSerializer.Deserialize<Dictionary<string, string>>(response)
рдФрд░ рдлрд┐рд░ рдЙрд╕ рдХреБрдВрдЬреА рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :)

рд╕рд┐рд░реНрдл рдореЗрд░реА рдЕрдкрдиреА рд╡рд┐рд╡реЗрдХ рдХреЗ рд▓рд┐рдП - рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ 5.0 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ExpandoObject рд╕рдорд░реНрдерди рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдореЗрдВ deserialize рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рджрд╛рдпрд░ рдХреА рдЧрдИ рд╣реИ? рдпрд╣рд╛рдБ рд╕рднреА рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╢реАрд░реНрд╖рдХ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ, рдФрд░ рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдЧрддрд┐рд╢реАрд▓ deserializing рд╣реВрдБ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ List<Dictionary<string, dynamic>> ред рдЕрднреА рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдкрд░ рд╡рд╛рдкрд╕ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ :(

рдмрд╕ рдХреБрдЫ рд╕реА # 8 рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдореЛрдб @tchivs рд╕рд╣рд╛рдпрдХ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ :)

/// <summary>
/// Temp Dynamic Converter with c# 8
/// by:[email protected]
/// </summary>
public class DynamicJsonConverter : JsonConverter<dynamic>
{
    public override dynamic Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        => reader.TokenType switch
        {
            JsonTokenType.True => true,
            JsonTokenType.False => false,
            JsonTokenType.Number => reader.TryGetInt64(out long l) ? 1 : reader.GetDouble(),
            JsonTokenType.String => reader.TryGetDateTime(out DateTime datetime) ? datetime.ToString() : reader.GetString(),
            JsonTokenType.StartObject =>  ReadObject(JsonDocument.ParseValue(ref reader).RootElement),
            // Use JsonElement as fallback.
                _ =>JsonDocument.ParseValue(ref reader).RootElement.Clone()
        };

    private object ReadObject(JsonElement jsonElement)
    {
        IDictionary<string, object> expandoObject = new ExpandoObject();
        foreach (var obj in jsonElement.EnumerateObject())
        {
            var k = obj.Name;
            var value = ReadValue(obj.Value);
            expandoObject[k] = value;
        }
        return expandoObject;
    }
    private object? ReadValue(JsonElement jsonElement)
        =>
         jsonElement.ValueKind switch
        {
            JsonValueKind.Object => ReadObject(jsonElement),
            JsonValueKind.Array => ReadList(jsonElement),
            JsonValueKind.String => jsonElement.GetString(),
            JsonValueKind.Number =>  jsonElement.TryGetInt64(out long l) ? 1 :0,
            JsonValueKind.True => true,
            JsonValueKind.False =>false,
            JsonValueKind.Undefined => null,
            JsonValueKind.Null => null,
                _ => throw new ArgumentOutOfRangeException()
        };

    private object? ReadList(JsonElement jsonElement)
    {
        var list = new List<object?>();
        jsonElement.EnumerateArray().ToList().ForEach(j => list.Add(ReadValue(j)));
        return list.Count == 0 ? null : list;
    }

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

@ rs38 рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╡рд╣реА рдерд╛ рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реВрдХреНрд╖реНрдо рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЖрдкрдХреЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ "рд╕рдВрдЦреНрдпрд╛" рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЧрд▓рдд рд╣реИрдВ:

JsonTokenType.Number => reader.TryGetInt64(out long l) ? 1 : reader.GetDouble(),

рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

JsonTokenType.Number => reader.TryGetInt64(out long l) ? l : reader.GetDouble(),

JsonValueKind.Number => jsonElement.TryGetInt64(out long l) ? 1 :0,

рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

JsonValueKind.Number => jsonElement.TryGetInt64(out long l) ? l :0,

@layomia рдпрд╣ рдЧрдВрднреАрд░ рдирд╣реАрдВ рд╣реИред рд╕рдорд░реНрдерди рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ System.Text.Json рдХреЛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛)! рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдордп рд╕реАрдорд╛ рднреА рдирд╣реАрдВ рд╣реИ!

рдореЗрд░рд╛ рдкрд░рд┐рджреГрд╢реНрдп CosmosDB рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдореИрдВ рдирдП .NET SDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ JsonSerializer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдХреАрдорд╛рд▓реЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдЬреЛ рдореБрдЭреЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ) .
рдореБрдЭреЗ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@ SocVi100 рдЗрд╕рдХреЗ рд▓рд┐рдП Microsoft рдкрд░ рдЕрдкрдиреА рдЖрд╢рд╛ рди @layomia рдиреЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╢рд╛рдУрдВ рдХреЛ

рдЖрдк рдпреЛрдЧрджрд╛рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗрддреЗ? рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдкреАрдЖрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ!

https://github.com/dotnet/runtime/blob/master/docs/coding-guidelines/adding-api-guidelines.md
https://github.com/dotnet/runtime/blob/master/docs/area-owners.md (рд▓реАрдб:
@ericstj |, рдорд╛рд▓рд┐рдХ: @layomia @steveharter @jozkee)

рдЖрдк рдпреЛрдЧрджрд╛рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗрддреЗ? рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдкреАрдЖрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ!

рдХрд╛рд╢ рдореИрдВред

рдореЗрд░рд╛ рдкрд░рд┐рджреГрд╢реНрдп CosmosDB рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдореИрдВ рдирдП .NET SDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ JsonSerializer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдХреАрдорд╛рд▓реЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдЬреЛ рдореБрдЭреЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ) .
рдореБрдЭреЗ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

CosmosClientBuilder.WithCustomSerializer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рдЕрд▓рдЧ

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: CosmosJsonNetSerializer

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

@layomia рдиреЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╢рд╛рдУрдВ рдХреЛ

@RobbyDeLaet рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рд░рдЪрдирд╛рддреНрдордХ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рдо рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рд╢реАрд░реНрд╖ рдЕрдиреБрд░реЛрдзрд┐рдд рдЧреНрд░рд╛рд╣рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред Newtonsoft.Json рдХреЗ рд╕рд╛рде рдлреАрдЪрд░ рд╕рдорд╛рдирддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣рд╛рдБ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рдирд╛ рд╣реИ ред

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

рд╣рдорд╛рд░рд╛ рдЙрджреНрджреЗрд╢реНрдп Newtonsoft.JSON рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдкреНрд░рджрд░реНрд╢рди, рд╕реБрд░рдХреНрд╖рд╛, рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдФрд░ рд▓реЗрдпрд░рд┐рдВрдЧ рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рд▓рд╛рдн рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕реЗ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рд╣рдо System.Text.Json рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рд╕рдордп рдХреЗ рд╕рд╛рде рд╣рдо рдЗрд╕реЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдВ рд░реБрдЪрд┐ рд╕реБрди рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВред

рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдВрдд рдореЗрдВ рдмреАрдЪ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛, рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ deserialization рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ CosmosDB рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдкрд░ ExpandoObject рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдкреБрд░рд╛рдиреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХреВрдВред
@RobbyDeLaet , рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдЙрдореНрдореАрджреЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВрдиреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдмрд╛рд░ рдирд┐рд░рд╛рд╢ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рдлреНрд░реАрд▓рд╛рдВрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ CosmosDB, EntityFramework рдФрд░ Identity рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЖрд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рдЪрдореБрдЪ, рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╣реИ, рдФрд░ рд╡реЗ рд╣рдореЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд╝рд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ UserVoice рдкрд░ рдХрд┐рддрдиреЗ рд╡реЛрдЯ рд╣реИрдВ рдпрд╛ рдЬреЛ рднреА рд╣реЛред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ ...
рд╕рдорд╕реНрдпрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреИрд╕реА рд╣реЛрддреА рд╣реИ: рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ = рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдЙрдореНрдореАрджреЗрдВ

рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдирдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдирдореВрдиреЗ рджреЗрдЦреЗрдВ:

  • @tchivs рд╕реЗ (рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП ExpandoObject рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП List<object> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)
  • @denmitchell рд╕реЗ (рдЬреЛ ExpandoObject рдмрдЬрд╛рдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП IL Emit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдирдпрд╛ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЬрдм рдпрд╣ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рддреЛ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд░ рджреВрдВрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЙрд╕ рдирдореВрдиреЗ рдХреЛ Newtonsoft рд╡рд░реНрдХ-рдЕрд░рд╛рдЙрдВрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ @tdykstra

рдПрдХ рд╡рд┐рд╡рд░рдг рдкрд░ рдЕрднреА рддрдХ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ рдХрд┐ dynamic рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝реА System.Linq.Expressions.dll рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдЗрд╕ рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЗ-рдЯреВ-рдкреНрд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдЕрд╕реЗрдВрдмрд▓реА (рдЬреИрд╕реЗ System.Text.Json.Converters.dll ) рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдХрдирд╡рд░реНрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЖрдХрд╛рд░ (рдЬреИрд╕реЗ рд╕реНрд╡рдпрдВ рдирд┐рд╣рд┐рдд рдРрдк рдпрд╛ рдмреНрд▓реЗрдЬрд╝рд░) рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдРрдк)ред

рд╕рд┐рд░реНрдл рдореЗрд░реА рдЕрдкрдиреА рд╡рд┐рд╡реЗрдХ рдХреЗ рд▓рд┐рдП - рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ 5.0 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ExpandoObject рд╕рдорд░реНрдерди рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдореЗрдВ deserialize рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рджрд╛рдпрд░ рдХреА рдЧрдИ рд╣реИ? рдпрд╣рд╛рдБ рд╕рднреА рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╢реАрд░реНрд╖рдХ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ, рдФрд░ рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдЧрддрд┐рд╢реАрд▓ deserializing рд╣реВрдБ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ List<Dictionary<string, dynamic>> ред рдЕрднреА рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рдкрд░ рд╡рд╛рдкрд╕ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ :(

рдЕрдм рдореИрдВ рдПрдХ рдкреБрд░рд╛рдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ deserialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ "valueKind" рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХреЛ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдирдП neetonsoft.json рд╕рдВрдХреБрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдерд╛? рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд░реВрдЯ рд▓реЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

@ericstj рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛, рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд╛рдпрдж рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рдХрдареЛрд░ рдереА, рд▓реЗрдХрд┐рди @ SocVi100 рдХреА рддрд░рд╣ рдореИрдВ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ рдФрд░ рдХрднреА-рдХрднреА рдирд┐рд░рд╛рд╢рд╛рдУрдВ рдХреЛ рдКрдкрд░реА рд╣рд╛рде рдорд┐рд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╣рдордиреЗ рдпрд╣рд╛рдВ рдПрдХ рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рдХреАред рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрджреЗрд╢ рдорд┐рд▓рд╛ рд╣реИред

рд╕рд┐рд░реНрдл рдореЗрд░реЗ рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рдХреЗ рд▓рд┐рдП - рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ 5.0 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ExpandoObject рд╕рдорд░реНрдерди рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБ рдореЗрдВ deserialize рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рджрд╛рдпрд░ рдХреА рдЧрдИ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ deserializing рдХреЗ рдмрд╛рдж рдЖрдк рджреЗрд░ рд╕реЗ рдмрд╛рдзреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╕рднреА рдЧреБрдгреЛрдВ (рдиреЗрд╕реНрдЯреЗрдб рд╕рдореЗрдд) рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

dynamic obj = JsonSerializer.Deserialize<dynamic>(json);
string s = obj.MyChildProperty.MyStringList[2];

рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╢рдмреНрджрд╛рд░реНрде рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ExpandoObject рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ:

ExpandoObject expando = JsonSerializer.Deserialize<ExpandoObject>(json);
dynamic obj = expando;
string s = obj.MyChildProperty.MyStringList[2];

рддреЛ рджрд╛рдпрд░реЗ рдХреА рдореЗрд░реА рд╕рдордЭ:

  • Deserialize<dynamic>(json) рдпрд╛ рддреЛ рдПрдХ рдЖрджрд┐рдо, рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рд╡рд╕реНрддреБ ExpandoObject рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ IDynamicMetaObjectProvider рдпрд╛ рдПрдХ JITed рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрдЬ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ JsonElement рд▓реМрдЯрд╛рддрд╛ рд╣реИред
  • Deserialize<ExpandoObject>(json) (рдЬреЛ IDynamicMetaObjectProvider ) рдХреЛ рдПрдХ рдЙрдЪрд┐рдд ExpandoObject рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдмрджрд▓реЗ рдореЗрдВ dynamic рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрдЬ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдореВрд▓ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░-рдЧреБрдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдиреЗрд╕реНрдЯреЗрдб рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП JsonElement рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред
  • Serialize<ExpandoObect>() рдЙрдореНрдореАрдж рдХреЗ
  • Serialize<IDynamicMetaObjectProvider ()> рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ рдЬрд╣рд╛рдВ ExpandoObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

3.0 - 5.0 рдореЗрдВ рд╢рдмреНрджрд╛рд░реНрде:

  • ExpandoObject рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ExpandoObject рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ IDictionary<string, object> рдФрд░ STJ рдкреНрд░рддреНрдпреЗрдХ object рдорд╛рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдЧрд╛ рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХ рдЖрджрд┐рдо, рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рд╡рд╕реНрддреБ рд╣реЛред
  • рдПрдХ ExpandoObject рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдХреНрд░рдорд╛рдВрдХрди рдХрд░рдирд╛ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореВрд▓ рдЧреБрдг "рдЙрдЪрд┐рдд" рд╡рд┐рд╕реНрддрд╛рд░-рдЧреБрдг рд╣реИрдВ; рдХреЛрдИ рднреА рдиреЗрд╕реНрдЯреЗрдб рдЧреБрдг JsonElement рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓ рдореЗрдВ рдЕрд╕рдВрдЧрддрд┐ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ ExpandoObject рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

3.0-5.0 рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк:

  • ExpandoObject рдФрд░\рдпрд╛ object рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рд▓рд┐рдЦреЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдкреЛрд╕реНрдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдореИрдВ рдЬрд▓реНрдж рд╣реА рдПрдХ рдирдП рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ 6.0 рдлреАрдЪрд░ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд░рддрд╛ рд╣реИред
  • рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рдЕрдХреНрд░рдорд╛рдВрдХрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк ExpandoObject (рдпрд╛ dynamic рдпрджрд┐ рдкреНрд░рдХрд╛рд░ ExpandoObject рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдПрд╕рдЯреАрдЬреЗ рдореЗрдВ рдЖрдЬ ExpandoObject рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдПрдХ рдЕрд╕рдВрдЧрддрд┐ рд╕рдорд╕реНрдпрд╛ рд╣реИ, ExpandoObject рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдкрд░
  • рдЧрддрд┐рд╢реАрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмрдЬрд╛рдп JsonElement рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред JsonElement "рдЕрдиреБрдорд╛рди" рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ JSON рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирдХреНрд╢реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ GetString (), GetInt32 (), рдЖрджрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рде рд╣реА, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдХрд╕реНрдЯрдо рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ "рдЕрдиреБрдорд╛рди" рд╣реИ рдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдЬреЗрдПрд╕рдУрдПрди рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЛ deserialization рдХреЗ рджреМрд░рд╛рди рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ JSON рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдпрд╛ рддреЛ DateTime рдпрд╛ string рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ JSON рдирдВрдмрд░ рдХреЛ double рдпрд╛ long рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ JSON рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдиреНрдпреВрдЯрдирд╕реЙрдлреНрдЯ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЬрдм рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ object (рдЖрдЬ рдпрд╣ JsonElement ) рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рднреА рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣рд╛рдБ 3.0 - 5.0 STJ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Diagnostics;
using System.Linq;
using System.Text.Json;

namespace ConsoleApp
{
    class Program
    {
        const string ExpectedJson = "{\"A\":\"A\",\"B\":[1,2],\"C\":42,\"D\":\"2020-01-01T00:00:00\",\"E\":{\"A_Child\":\"A_Child\"}}";

        static void Main(string[] args)
        {
            DateTime dateTime = new DateTime(2020, 1, 1);

            dynamic myDynamicChild = new ExpandoObject();
            myDynamicChild.A_Child = "A_Child";

            dynamic myDynamic = new ExpandoObject();
            myDynamic.A = "A";
            myDynamic.B = new List<int>() { 1, 2 };
            myDynamic.C = 42;
            myDynamic.D = dateTime;
            myDynamic.E = myDynamicChild;

            // Verify we can call late-bound property.
            int c = myDynamic.C;
            Debug.Assert(c == 42);

            // STJ can serialize with ExpandoObject since it implements IDictionary<string, object>.
            string json = JsonSerializer.Serialize<ExpandoObject>(myDynamic);
            Debug.Assert(json == ExpectedJson);

            // Using 'dynamic' against backing ExpandoObject works.
            json = JsonSerializer.Serialize<dynamic>(myDynamic);
            Debug.Assert(json == ExpectedJson);

            // Deserialize with <dynamic>, <object> and <JsonElement>.
            // For 5.0, using one of these is recommended over ExpandoObject because the programming model will be
            // consistent for the root type and all nested types.
            // Using <JsonElement> makes it clear and non-abiguous.
            // Using <object> by default uses 'JsonElement', but can be overridden by a custom converter.
            // Using <dynamic> uses 'object' which uses 'JsonElement'.
            {
                dynamic d = JsonSerializer.Deserialize<dynamic>(json);
                VerifyJsonElement(d);

                try
                {
                    // We will get an exception here if we try to access a dynamic property since 'object' is deserialized
                    // as a JsonElement and not an ExpandoObject.
                    c = d.C;
                    Debug.Fail("Should have thrown Exception!");
                }
                catch (Exception ex)
                {
                    Debug.Assert(ex.Message == "'System.Text.Json.JsonElement' does not contain a definition for 'C'");
                }

                // Serializing with <object> creates a JsonElement by default (can be changed by a custom converter).
                object o = JsonSerializer.Deserialize<object>(json);
                VerifyJsonElement((JsonElement)o);

                // Serialize with explicit <JsonElement>.
                JsonElement e = JsonSerializer.Deserialize<JsonElement>(json);
                VerifyJsonElement(e);
            }

            // Deserialize with ExpandoObject. This creates an ExpandoObject with the root Type having Expando-properties
            // but the value of those properties will be JsonElement. All other nested properties\objects\collections will
            // also be JsonElement. Due to the inconsistency of having only root-level Expando-properties (such as A_Child),
            // deserializing as ExpandoObject is not recommended (unless a ExpandoObject custom converter is used).
            {
                // When STJ deserializes, it creates ExpandoObjects via IDictionary<string, object> where 'object' is JsonElement.
                ExpandoObject expando = JsonSerializer.Deserialize<ExpandoObject>(json);
                Debug.Assert(((IDictionary<string, object>)expando).Keys.Count == 5);
                myDynamic = expando;

                JsonElement jsonElement = myDynamic.A;
                Debug.Assert(jsonElement.GetString() == "A");

                jsonElement = myDynamic.B;
                Debug.Assert(jsonElement.EnumerateArray().Count() == 2);

                jsonElement = myDynamic.C;
                Debug.Assert(jsonElement.GetInt32() == 42);

                jsonElement = myDynamic.D;
                Debug.Assert(jsonElement.GetDateTime() == dateTime);

                jsonElement = myDynamic.E;
                // Here we have an inconsistency. Nested object property must use JsonElement (not a dynamic property).
                Debug.Assert(jsonElement.GetProperty("A_Child").GetString() == "A_Child");

                // Re-serialize works as expected.
                json = JsonSerializer.Serialize<ExpandoObject>(myDynamic);
                Debug.Assert(json == ExpectedJson);

                // Re-serialize works as expected; dynamic works here since backed by ExpandoObject in this example.
                json = JsonSerializer.Serialize<dynamic>(myDynamic);
                Debug.Assert(json == ExpectedJson);
            }

            void VerifyJsonElement(JsonElement elem)
            {
                // Verify JsonElement
                Debug.Assert(elem.GetProperty("A").GetString() == "A");
                Debug.Assert(elem.GetProperty("B").EnumerateArray().Count() == 2);
                Debug.Assert(elem.GetProperty("C").GetInt32() == 42);
                Debug.Assert(elem.GetProperty("D").GetDateTime() == dateTime);
                Debug.Assert(elem.GetProperty("E").GetProperty("A_Child").GetString() == "A_Child");

                // Re-serialize
                json = JsonSerializer.Serialize<dynamic>(elem);
                Debug.Assert(json == ExpectedJson);

                json = JsonSerializer.Serialize<JsonElement>(elem);
                Debug.Assert(json == ExpectedJson);
            }
        }
    }
}

@ rs38 рдХреНрдпрд╛ рдЖрдк @ ryan-hollister-q2 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреАрдЖрд░ https://github.com/dotnet/runtime/pull/42097 рдкрд░ рд╣реИред

@ rs38 рдХреНрдпрд╛ рдЖрдк @ ryan-hollister-q2 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡рд╣ рдореЗрд░рд╛ рдХреЛрдб рдирд╣реАрдВ рдерд╛, рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдкрд╣рд▓реЗ @tchivs рд╕реЗ рдХреБрдЫ рд╕реНрдирд┐рдкреЗрдЯ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдереЗред

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

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

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

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

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

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

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