ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π»ΠΈ 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 Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ - ΡΠ»ΡΠΆΠ±Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅. ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΡΠ°ΠΊΡΡ ββΠΊΠ°ΠΊ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ REST, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Π² MongoDB (ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠΈΠΊΡΠΈΠ²Π½Π°Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° REST, Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ mongo Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ 1-1, ΠΎΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°).
Π’Π°ΠΊ ΡΡΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π½Π°ΠΌ Π½ΡΠΆΠ½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° / ExpandoObject.
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π³ΠΎ Π² Π΄ΡΡΠ³ΠΈΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°Ρ .
ΠΡ ΡΠΎΠΆΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΡΠΈΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ°Ρ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ - ΡΡΠΎ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ json. ΠΠ΅ΡΠ½ΡΠ»ΡΡ ΠΊ Π±ΠΎΠ»Π΅Π΅ Π·ΡΠ΅Π»ΠΎΠΌΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡ Json.NET.
ΠΡΠΈΠ²Π΅Ρ, ΡΠ΅Π±ΡΡΠ°
ΠΊΠ°ΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ»ΠΊΠ° ΡΠ΅ΠΉΡΠ°Ρ?
ΠΠΎΠ³Ρ Π»ΠΈ Ρ Π½Π°ΡΡΡΠΎΠΈΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π½ΠΈΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ?
@SidShetye, ΡΡ ΡΡΠΎ-ΡΠΎ ΡΠΊΠ°Π·Π°Π», Π²Π΅ΡΠ½ΡΠ»ΡΡ ΠΊ Π±ΠΎΠ»Π΅Π΅ Π·ΡΠ΅Π»ΠΎΠΌΡ, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°?
@MickeyReznikov : ΡΠΌ. Https://stackoverflow.com/questions/15455304/deserialize-a-property-as-an-expandoobject-using-json-net ΠΈΠ»ΠΈ google Β«json.net expandoobjectΒ»
@MickeyReznikov , ΠΎΡΠ²Π΅ΡΠΈΠ»ΠΈ Π½Π° Π²Π°Ρ Π²ΠΎΠΏΡΠΎΡ? Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ @SidShetye ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Newtonsoft.Json
Π΄Π»Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° (System.Text.Json) Π΅ΡΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΈΡ
. Π ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ asp.net Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° AddNewtonsoftJson.
Π‘ΠΌ. Https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#jsonnet -support
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π΅ΡΡΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ - Ρ ΠΏΡΠΎΡΡΠΎ Ρ ΠΎΡΡ Π²ΡΠ·Π²Π°ΡΡ REST API Ρ HttpClient ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ· ΠΎΡΠ²Π΅ΡΠ°. Π― Π½Π΅ Ρ ΠΎΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡΠ²Π΅ΡΠ° ... Π‘ JSON.NET Ρ ΠΌΠΎΠ³ Π±Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Β«Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉΒ» ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌΡ ΡΠ²ΠΎΠΉΡΡΠ²Ρ.
Π‘ https://github.com/dotnet/corefx/issues/41472 ΠΎΡ @ ghost1372 :
ΠΏΡΠΈΠ²Π΅Ρ, Ρ Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ Ρ ΠΎΡΠΎΡΠ΅Π΅ ΠΌΠ΅ΡΡΠΎ, ΡΡΠΎΠ±Ρ Π·Π°Π΄Π°ΡΡ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ
ΠΠ°ΠΆΠ΅ΡΡΡ, ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΡΠΎΡ ΠΊΠΎΠ΄, Π½ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π», Π΅ΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ?var objList = System.Text.Json.JsonSerializer.Deserialize<List<dynamic>>(json);
ΠΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ Π½Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΠΌΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ»Ρ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Ρ ΡΠ°Π½ΠΈΠΌΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΡΠΏΠΈΡΠΊΠ° ΠΏΠΎΠΈΡΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ jquery.jtable.
ΠΠ΅Π· Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ JsonSerializer Π΄Π»Ρ ExpandoObject ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Json Π² ΡΠ΄ΡΠ΅ dotnet.
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΎΡ ΠΆΠ΅ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΡΡ @estiller ΠΈ @SidShetye.
Π’Π΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π²Π΅ΡΠ½ΡΡΡΡΡ Π½Π° Json.NET.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΠΌΠ΅ΡΡ Π²Π΅Ρ Ρ Π±Π»ΠΈΠΆΠ΅ ΠΊ _ ΡΠ΅ΠΉΡΠ°Ρ_, ΡΠ΅ΠΌ ΠΊ Π±ΡΠ΄ΡΡΠ΅ΠΌΡ ? π€
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);
}
}
ΠΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ POST Π² ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠΈ System.Text.Json:
[HttpPost]
public async Task<IActionResult> SubmitAsync(dynamic model)
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄, Π½ΠΎ Π½Π΅ Π±ΡΠ»ΠΎ ΠΏΡΡΠΌΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Β«ΠΌΠΎΠ΄Π΅Π»ΠΈΒ» Π² Π½ΠΈΡΡ ΠΎΠ΄ΡΡΠ΅ΠΌ Π±ΡΠΊΡΠ½Π΄-ΠΊΠΎΠ΄Π΅:
[HttpPost]
public async Task<IActionResult> SubmitAsync(JsonElement model)
Β«ΠΌΠΎΠ΄Π΅Π»ΡΒ» - ΡΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π½Π°Π±ΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ / ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ
Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². Π§ΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΊΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ dynamic
ΠΈΠ· JsonElement
, Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π²ΡΠ·Π²Π°ΡΡ model.GetRawText () ΠΈ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Newtonsoft Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡΠΎ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ΅Π»ΡΡ ΡΡΠΎΠ³ΠΎ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ Π±ΡΠ»ΠΎ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ Newtonsoft.json ΠΈΠ· ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠΎΠ³Ρ Π»ΠΈ Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΡΠΎΠΉ Π·Π°ΡΠ²ΠΊΠ΅ / ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ? ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΎΡΠ½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ΅ΡΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π½ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅?
/ cc @ahsonkhan @terrajobst
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° JsonSerializer Π΄Π»Ρ ExpandoObject (Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΡ)
Π― Π½ΠΎΠ²ΠΈΡΠΎΠΊ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΌΠ΅ΡΡΠ° Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡΠ½Ρ, ΠΏΡΠΈΠ³Π»Π°ΡΠ°Π΅ΠΌ Π²ΡΠ΅Ρ
ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ
.net Core3 Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ
Π΄ΠΎΠ±Π°Π²ΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ:
`` Π‘ #
///
/// Π’Π΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΠ½ΡΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»Ρ
/// Π°Π²ΡΠΎΡ: [email protected]
///
ΠΎΡΠΊΡΡΡΡΠΉ ΠΊΠ»Π°ΡΡ DynamicJsonConverter: JsonConverter
{
ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ (ΡΠΌ. Utf8JsonReader reader,
Π’ΠΈΠΏ typeToConvert,
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ 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 , Π²Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΌΠ΅Π½Ρ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ; Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Converters Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΡΡΠΎΠ³ΠΎ:
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 .
Π― Π±ΡΠ΄Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄Π»Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ , ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ EF Core; Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ json-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΠ»ΡΡΠ°Π΅Π²). ΠΠ°ΠΉΡΠ΅ ΠΌΠ½Π΅ Π·Π½Π°ΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎΠ΅.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°. Π£Π΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ Microsoft Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π² ΡΠ°Π·ΡΠΌΠ½ΡΠ΅ ΡΡΠΎΠΊΠΈ. Π Π°Π±ΠΎΡΠ° Ρ ΠΎΡΠ²Π΅ΡΠ°ΠΌΠΈ GraphQL Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΈ ΡΡΠΎΠ΄Π»ΠΈΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π³Π»ΡΠ±ΠΎΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΠ²ΠΎΠΉΡΡΠ².
Π― ΠΏΡΠΎΡΠΈΡΠ°Π» ΡΠ΅ΠΏΠΎΡΠΊΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π², ΠΈ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ· Π½ΠΈΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠ΅Π½ΠΎ Π½Π° Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡ, ΠΌΠΎΠ»ΡΠ° "ΡΠ΅ΡΠΏΠΈΡ Π½Π΅ΡΠ΄Π°ΡΡ". ΠΡΡΠ°ΡΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΠ²ΠΎΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ, Ρ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π» ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅:
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
ΡΠ°Π²Π½ΠΎ {}
, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Π½ΠΎ Π΄Π°Π΅Ρ ΠΏΡΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ json.
ΠΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ? ΠΈΠ»ΠΈ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π½ΡΡΡ / ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ?
ΠΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ? ΠΈΠ»ΠΈ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π½ΡΡΡ / ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ?
ΠΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ. ΠΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ Π΄Π»Ρ Π΄Π²ΡΡ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΎΠΊ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ²ΡΠ·Π°Π½Π° Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° expando (ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π΄Π»Ρ ΠΎΠ±Π΅ΠΈΡ ΡΡΠΎΡΠΎΠ½ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ).
Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΡΠ΅Π³ΠΎΠ΄Π½Ρ - Ρ
ΠΎΡΠ΅Π» ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ JsonElement
Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ JsonDocument
. ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ - ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ Π΄Π»Ρ JsonDocument
ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΎΡΠ»ΠΎΠΆΠΈΡΡ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ - ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ JsonElement
Π±ΡΠ΄ΡΡ ΡΠΎΠ±ΡΠ°Π½Ρ.
ΠΡΠ΅ ΠΌΠ½Π΅ Π½ΡΠΆΠ΅Π½ Π±ΡΠ» Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ. ΠΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠ²Π°ΡΡ.
JsonSerializer.Deserialize<Dictionary<string, string>>(response)
Π ΠΏΠΎΡΠΎΠΌ ΠΈΡΠΈ Π½ΡΠΆΠ½ΡΠΉ ΠΌΠ½Π΅ ΠΊΠ»ΡΡ :)
ΠΡΠΎΡΡΠΎ Π΄Π»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ°ΡΡΡΠ΄ΠΊΠ° - ΠΎΡΠ½ΠΎΡΠΈΡΡΡ Π»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΊ 5.0, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΊ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ExpandoObject ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ? ΠΠ΅ Π²ΡΠ΅ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΡ Π·Π΄Π΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈ ΠΌΠ½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ List<Dictionary<string, dynamic>>
. ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠ»ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° Newtonsoft :(
ΠΏΡΠΎΡΡΠΎ Ρ ΠΎΡΠ΅Π» ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡΠΌΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° C # 8 Π΄Π»Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
/// <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 ΠΠ΅ @layomia ΡΠ°Π·Π²Π΅ΡΠ»Π° Π²ΡΠ΅ Π½Π°Π΄Π΅ΠΆΠ΄Ρ Π½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΌ Π±ΡΠ΄ΡΡΠ΅ΠΌ. ΠΠΎΡ ΠΎΠΆΠ΅, ΠΈΠΌ Π½Π°ΠΏΠ»Π΅Π²Π°ΡΡ Π½Π° Π½ΡΠΆΠ΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠ½ΠΈ ΠΊΡΠΈΡΠ°Π»ΠΈ: Β«ΠΠ°Π±ΡΠ΄ΡΡΠ΅ ΠΎ json.net, ΠΌΡ Π²Π°Ρ ΠΏΡΠΈΠΊΡΡΠ»ΠΈ!Β» Π ΡΡΠ°ΡΡΡΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π½Π΅ Π·Π°Π±ΡΠ»ΠΈ ΠΏΡΠΎ json.net ΠΈ ΡΠΎΠΌΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.
ΠΏΠΎΡΠ΅ΠΌΡ ΡΡ Π½Π΅ ΡΡΠ°ΡΡΠ²ΡΠ΅ΡΡ? ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π² ΠΏΠΈΠ°Ρ!
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, ΠΈ ΡΡΠ° Π½Π΅ ΠΏΠΎΠ΄ΠΎΡΠ»Π°. FWIW ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΎΡΠ΅Π½Ρ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ Π»ΠΈΠ½ΠΈΠΈ ΡΠ°Π·ΡΠ΅Π·Π°, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠΎΠ·Π΄Π½ΠΈΠΉ Ρ ΠΎΠ΄.
@layomia ΡΠ°Π·Π²Π΅ΡΠ»Π° Π²ΡΠ΅ Π½Π°Π΄Π΅ΠΆΠ΄Ρ Π½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΌ Π±ΡΠ΄ΡΡΠ΅ΠΌ. ΠΠΎΡ ΠΎΠΆΠ΅, ΠΈΠΌ Π½Π°ΠΏΠ»Π΅Π²Π°ΡΡ Π½Π° Π½ΡΠΆΠ΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠ½ΠΈ ΠΊΡΠΈΡΠ°Π»ΠΈ: Β«ΠΠ°Π±ΡΠ΄ΡΡΠ΅ ΠΎ json.net, ΠΌΡ Π²Π°Ρ ΠΏΡΠΈΠΊΡΡΠ»ΠΈ!Β» Π ΡΡΠ°ΡΡΡΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π½Π΅ Π·Π°Π±ΡΠ»ΠΈ ΠΏΡΠΎ json.net ΠΈ ΡΠΎΠΌΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.
@RobbyDeLaet, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ? ΠΡ ΡΡΠ°ΡΠ°Π΅ΠΌΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅, ΡΡΠΎΠ±Ρ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠΈΡΡ ΡΠ°ΠΌΡΠ΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², ΡΠΎΡ ΡΠ°Π½ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ Π΄ΠΈΠ·Π°ΠΉΠ½Π°. Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΏΠ°ΡΠΈΡΠ΅ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΉ Ρ Newtonsoft.Json, Π²ΠΎΡ ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ .
System.Text.Json Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ°ΠΌ. ΠΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² System.Text.Json Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π½ΠΎ Π΅ΡΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΡΠ΅ ΠΎΠ±Ρ ΠΎΠ΄Π½ΡΠ΅ ΠΏΡΡΠΈ. ΠΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ.
ΠΡ Π½Π΅ ΡΡΡΠ΅ΠΌΠΈΠΌΡΡ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Newtonsoft.JSON. ΠΡΠ»ΠΈ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. ΠΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ System.Text.Json ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ, ΡΠΎΡ ΡΠ°Π½ΠΈΠ² ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡΠ΅ Π½Π°ΠΌΠΈ ΡΡΠΏΠ΅Ρ ΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ°ΠΌ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΡΡΠΈ. Π‘ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΌΡ Π½Π°Π΄Π΅Π΅ΠΌΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ ΡΠΈΡΠ»Π° Π»ΡΠ΄Π΅ΠΉ. Π― ΡΠ»ΡΡΡ Π·Π΄Π΅ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ ΠΈ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΡΡΡΡ Π½Π° ΡΡΠΎΠΌ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°ΡΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ. Π― Π½Π°ΠΊΠΎΠ½Π΅Ρ Π΄ΠΎΡΠ΅Π» Π΄ΠΎ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ Newtonsoft ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π½ΠΎ ΠΌΠ½Π΅ Π²ΡΠ΅ Π΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ. Π― Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ExpandoObject Π² ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ CosmosDB Π½Π΅ ΠΏΡΠΎΠ΄Π»ΠΈΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΠ»Π³ΠΎ, ΡΡΠΎΠ±Ρ Ρ ΠΌΠΎΠ³ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΡΡΠ°ΡΠΎΠ³ΠΎ.
@RobbyDeLaet , ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ! Π£ ΠΌΠ΅Π½Ρ Π½Π΅Ρ ΠΎΡΠΎΠ±ΡΡ
Π½Π°Π΄Π΅ΠΆΠ΄ Π½Π° ΡΠΎ, ΡΡΠΎ Microsoft Π²Π½Π΅Π΄ΡΠΈΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π· ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²ΡΠ²Π°Π»ΡΡ Π² Π½ΠΈΡ
. ΠΠ°ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ-ΡΡΠΈΠ»Π°Π½ΡΠ΅Ρ, Ρ Π³ΠΎΠ΄Π°ΠΌΠΈ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΠΆΠ΄Π°Π», ΠΏΠΎΠΊΠ° Π²Π°ΠΆΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ΅ CosmosDB, EntityFramework ΠΈ Identity, ΠΈ ΠΎΠ½ΠΈ ΠΏΠΎ-ΡΠ²ΠΎΠ΅ΠΌΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡ Π½Π°Ρ. ΠΠ΅Π²Π°ΠΆΠ½ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ Π½ΠΈΡ
Π³ΠΎΠ»ΠΎΡΠΎΠ² Π½Π° UserVoice ΠΈΠ»ΠΈ ΡΠ΅ΠΌ-ΡΠΎ Π΅ΡΠ΅. Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ Π΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΎΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ΠΈ Π²ΡΡ
ΠΎΠ΄ΡΡ Π·Π° ΡΠ°ΠΌΠΊΠΈ ...
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΡΠ΅Π³Π΄Π° ΠΎΠ΄Π½Π° ΠΈ ΡΠ° ΠΆΠ΅: ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΠΊΠ΅ΡΠΈΠ½Π³Π° = ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ.
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΌΠΎΡΡ ΡΠ΅ΠΌ, ΠΊΠΎΠΌΡ Π½ΡΠΆΠ½Π° ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΌ. ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ:
ExpandoObject
Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ List<object>
Π΄Π»Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ)ExpandoObject
)Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΌΠΎΡΡ Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΠΊ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Ρ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π·Π΅Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠ΅ΡΠ° ΠΈ ΡΠ²ΡΠΆΡ Π΅Π³ΠΎ Π·Π΄Π΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ². ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Ρ Π΄ΠΎΠ±Π°Π²Π»Ρ ΡΡΠΎΡ ΠΎΠ±ΡΠ°Π·Π΅Ρ Π² ΡΠ°Π·Π΄Π΅Π» ΠΎΠ±Ρ ΠΎΠ΄Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Newtonsoft . cc @tdykstra
ΠΠ΄Π½Π° Π΄Π΅ΡΠ°Π»Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΅ΡΠ΅ Π½Π΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»Π°ΡΡ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ dynamic
ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΡΡ ΡΠ±ΠΎΡΠΊΡ System.Linq.Expressions.dll
; ΡΡΠΎ ΠΎΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π½ΠΎΠ²ΡΡ ΡΠ±ΠΎΡΠΊΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, System.Text.Json.Converters.dll
), ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠ»Π°ΡΡ Π·Π° ΠΈΠ³ΡΡ Π΄Π»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ Π·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ΅ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Blazor ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅).
ΠΡΠΎΡΡΠΎ Π΄Π»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ°ΡΡΡΠ΄ΠΊΠ° - ΠΎΡΠ½ΠΎΡΠΈΡΡΡ Π»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΊ 5.0, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΊ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ExpandoObject ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ? ΠΠ΅ Π²ΡΠ΅ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΡ Π·Π΄Π΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈ ΠΌΠ½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ
List<Dictionary<string, dynamic>>
. ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠ»ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° Newtonsoft :(
Π‘Π΅ΠΉΡΠ°Ρ Ρ ΡΠ΅ΡΡΠΈΡΡΡ ΡΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» Π΄Π»Ρ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΈ Π²ΠΈΠΆΡ ΡΡ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΡΠΎ ΠΈ Π² ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅, Ρ Β«valueKindΒ».
ΠΡΠ» Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½ΠΎΠ²ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² neetonsoft.json? ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π²ΡΡΠ΅ ΠΊΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°Π» Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ, Π½ΠΎ Π½Π΅ Π΄Π»Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
@ericstj ΠΠ·Π²ΠΈΠ½ΠΈΡΠ΅, ΠΌΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΡ Π±ΡΠ»Π°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ»ΠΈΡΠΊΠΎΠΌ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎΠΉ ΠΈ ΡΠ΅Π·ΠΊΠΎΠΉ, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ @ SocVi100, Ρ Π²Π½Π΅ΡΡΠ°ΡΠ½ΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠΎΡΡΠΎ Π΄Π»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ°ΡΡΡΠ΄ΠΊΠ° - ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΎΡΠ½ΠΎΡΡΡΠ°ΡΡΡ ΠΊ 5.0, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ExpandoObject ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌΠ°Ρ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΈΠΏ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΡΠ»Π΅ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ (Π²ΠΊΠ»ΡΡΠ°Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅) Ρ ΠΏΠΎΠ·Π΄Π½ΠΈΠΌ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ΠΌ:
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
ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ Π² STJ, ExpandoObject
Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.JsonElement
Π²ΠΌΠ΅ΡΡΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². JsonElement
Π½Π΅ ΠΏΡΡΠ°Π΅ΡΡΡ Β«ΡΠ³Π°Π΄Π°ΡΡΒ», ΠΊΠ°ΠΊΠΎΠΌΡ ΡΠΈΠΏΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ JSON, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, Π²ΡΠ·ΡΠ²Π°Ρ GetString (), GetInt32 () ΠΈ Ρ. Π.ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠ΅ΡΠ°, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Β«Π΄ΠΎΠ³Π°Π΄ΠΊΠΈΒ» ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ CLR ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ JSON Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠΎΠΊΠ° JSON ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π»ΠΈΠ±ΠΎ Π½Π° DateTime
ΠΈΠ»ΠΈ Π½Π° string
, Π½ΠΎΠΌΠ΅Ρ JSON ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π½Π° double
ΠΈΠ»ΠΈ long
, Π° ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΈΠΏ ΠΌΠ°ΡΡΠΈΠ²Π° JSON. ΠΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ Ρ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΎΠΉ Newtonsoft. ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ 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?
ΠΠ°ΠΊ ΠΈ Π±ΡΠ»ΠΎ ΠΎΠ±Π΅ΡΠ°Π½ΠΎ, PR Ρ ΠΎΠ±ΡΠ°Π·ΡΠΎΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ https://github.com/dotnet/runtime/pull/42097.
@ rs38 ΠΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π» @ ryan-hollister-q2?
ΡΡΠΎ Π±ΡΠ» Π½Π΅ ΠΌΠΎΠΉ ΠΊΠΎΠ΄, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΠ»ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈΠ· @tchivs ΡΠ°Π½Π΅Π΅ Π² ΡΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π΅ΡΡΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ - Ρ ΠΏΡΠΎΡΡΠΎ Ρ ΠΎΡΡ Π²ΡΠ·Π²Π°ΡΡ REST API Ρ HttpClient ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ· ΠΎΡΠ²Π΅ΡΠ°. Π― Π½Π΅ Ρ ΠΎΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡΠ²Π΅ΡΠ° ... Π‘ JSON.NET Ρ ΠΌΠΎΠ³ Π±Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Β«Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉΒ» ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌΡ ΡΠ²ΠΎΠΉΡΡΠ²Ρ.