рдХреНрдпрд╛ JsonSerializer.Parse(String, Type, JsonSerializerOptions)
рдбрд╛рдпрдирд╛рдорд┐рдХ ExpandoObject
рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
dynamic p = JsonSerializer.Parse(json, typeof(ExpandoObject));
рдирд╣реАрдВ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЗрд╕ рд╕рдордп рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдореЗрдВ 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
ExpandoObject рдХреЗ рд▓рд┐рдП JsonSerializer рд╕рдорд░реНрдерди (рдЕрдВрддрд░рд┐рдо рдЙрдкрд╛рдп)
рдореИрдВ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдВ, рдХрдИ рдЬрдЧрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИрдВ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
.net Core3 рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝реЗрдВ:
```рд╕реА#
///
/// рдЕрд╕реНрдерд╛рдпреА рдЧрддрд┐рд╢реАрд▓ рдХрдирд╡рд░реНрдЯрд░
/// рджреНрд╡рд╛рд░рд╛:[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 рдкрд░ рдХрд┐рддрдиреЗ рд╡реЛрдЯ рд╣реИрдВ рдпрд╛ рдЬреЛ рднреА рд╣реЛред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ ...
рд╕рдорд╕реНрдпрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреИрд╕реА рд╣реЛрддреА рд╣реИ: рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ = рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдЙрдореНрдореАрджреЗрдВ
рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдирдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдирдореВрдиреЗ рджреЗрдЦреЗрдВ:
ExpandoObject
рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП List<object>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)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 рд╕реЗ рдХреБрдЫ рд╕реНрдирд┐рдкреЗрдЯ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдереЗред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рднреА рд╣реИ - рдореИрдВ рд╕рд┐рд░реНрдл рдПрдЪрдЯреАрдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд░рдИрдПрд╕рдЯреА рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд░реНрдЧ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ ... JSON.NET рдХреЗ рд╕рд╛рде рдореИрдВ рдХреЗрд╡рд▓ "рдЧрддрд┐рд╢реАрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкрд╕рдВрдж рдХреА рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред