Při porovnání Newtonsoft.json a System.Text.JSON v kontextu MVVMCross se objeví několik klíčových rozdílů, které mohou mít dopad na to, jak zvládáte serializaci JSON a deserializaci ve vašich meziplatnových aplikacích.
Výchozí chování
- Newtonsoft.json je ve výchozím nastavení flexibilnější a odpouštějící. Podporuje odpovídající názvu vlastnosti, což znamená, že může JSON deserializovat, i když názvy vlastností v řetězci JSON neodpovídají přesně případu vlastností ve vaší třídě C#. Tato flexibilita je prospěšná pro manipulaci s údaji ze zdrojů, kde by kryt nemusí být konzistentní [1] [4].
- System.Text.JSON, na druhé straně, je ve výchozím nastavení přísná a citlivá na případ. Vyžaduje přesné shody mezi názvy vlastností JSON a názvy vlastností C#, což může vést k chybám deserializace, pokud se případy neshodují. Tato přísnost však zvyšuje výkon a bezpečnost [1] [4].
Serializace a deserializace
- Newtonsoft.json umožňuje více shovívavé serializace a deserializaci. Například může převést číselné hodnoty na vlastnosti řetězce a naopak, což není možné se systémem.text.json mimo krabici. To znamená, že pokud váš JSON obsahuje číselnou hodnotu, ale vaše vlastnost C# je řetězec, NewtonSoft.json to zvládne hladce, zatímco System.Text.JSON taková pole přeskočí [5].
- System.Text.JSON přísně přidržuje specifikaci JSON (RFC 8259) a nepodporuje deserializaci číselných hodnot do vlastností řetězce nebo naopak bez další konfigurace. Vyžaduje to explicitní převodníky, aby zvládli takové scénáře [4] [5].
Escaping
- Newtonsoft.Json je méně přísný, pokud jde o únik charakteru. Umožňuje procházet více znaků bez úniku, což může být prospěšné pro určité scénáře, ale může představovat bezpečnostní rizika, pokud nebude správně zvládnuta [1].
-System.Text.json ve výchozím nastavení uniká více znaků, včetně všech znaků mimo ASCII a znaků HTML, aby poskytovaly lepší ochranu před útoky XSS [1].
Field Support
- Newtonsoft.JSON podporuje přímo serializační a deserializační pole, což může být užitečné v některých scénářích, kde se nemovitosti nelze použít.
- System.text.json ve výchozím nastavení nepodporuje serializace nebo deserializace polí. Počínaje od .NET 5 však můžete povolit serializaci pole nastavením `jsonserializeroptions.includefields` až` true` nebo pomocí atributu `[JSONInClude] na konkrétních polích [3].
Výkon
- System.text.json je obecně rychlejší než Newtonsoft.JSON, zejména pro velké datové sady, díky svému zaměření na optimalizaci výkonu [9].
Integrace s mvvmcross
MVVMCross používá obal kolem Newtonsoft.JSON pro serializaci a deserializaci JSON. To znamená, že při používání MVVMCross pravděpodobně ve výchozím nastavení pracujete s flexibilním chováním Newtonsoft.JSON. Pokud se rozhodnete přepnout na System.Text.JSON, musíte upravit nastavení serializace a možná přidat vlastní převaděče tak, aby odpovídaly chování, které potřebuje [2] [6].
Stručně řečeno, zatímco Newtonsoft.Json nabízí flexibilitu a kompatibilitu s širokou škálou scénářů, System.Text.JSON upřednostňuje výkon, zabezpečení a přísné dodržování standardů JSON. Volba mezi nimi v MVVMCross závisí na vašich specifických požadavcích a na tom, zda potřebujete flexibilitu Newtonsoft.JSON nebo výkon a zabezpečení System.Text.JSON.
Citace:[1] https://learn.microsoft.com/en-us/dotnet/standard/serializace/system-text-json/migrate-from-newtonsoft
[2] https://www.mvvmcross.com/documentation/plugins/json
[3] https://stackoverflow.com/questions/58139759/how-to-use-class-fields-with-system-text-json-jsonserializer
[4] https://schneids.net/comparing-newtonsoft-json-with-system-text-json/
[5] https://www.seeleycoder.com/blog/net-core-json-serialization/
[6] https://www.nuget.org/packages/mvvmcross.plugin.json/
[7] https://devblogs.microsoft.com/dotnet/whats-next-for-system-text-json/
[8] https://stackoverflow.com/questions/71375019/how-to-workaround-newtonjson-and-system-text-json-difference
[9] https://www.youtube.com/watch?v=ocwodu8y3si
[10] https://stackoverflow.com/questions/18488310/mvvmcross-deserilization-error-for-json
[11] https://www.telerik.com/forums/data-binding-and-serialization-issue-with-system-text-json-core-3-0
[12] https://www.reddit.com/r/dotnet/comments/14xgfjl/shald_you_use_newtonsoftjson_or_systemtextjson/