Lorsque vous comparez Newtonsoft.json et System.Text.json dans le contexte de MVVMCross, plusieurs différences clés émergent qui peuvent avoir un impact sur la façon dont vous gérez la sérialisation et la désérialisation JSON dans vos applications multiplateformes.
Comportement par défaut
- Newtonsoft.json est plus flexible et pardonnant par défaut. Il prend en charge la correspondance du nom de la propriété insensible à la cas, ce qui signifie qu'il peut désérialiser JSON même si les noms de propriétés de la chaîne JSON ne correspondent pas exactement au cas des propriétés de votre classe C #. Cette flexibilité est bénéfique pour gérer les données provenant de sources où le boîtier peut ne pas être cohérent [1] [4].
- System.Text.json, en revanche, est strict et sensible à la casse par défaut. Il nécessite des correspondances exactes entre les noms de propriétés JSON et les noms de propriété C #, ce qui peut entraîner des erreurs de désérialisation si les cas ne correspondent pas. Cependant, cette rigueur améliore les performances et la sécurité [1] [4].
sérialisation et désérialisation
- Newtonsoft.json permet une sérialisation et une désérialisation plus clémentes. Par exemple, il peut convertir les valeurs numériques en propriétés de chaîne et vice versa, ce qui n'est pas possible avec System.Text.json hors de la boîte. Cela signifie que si votre JSON contient une valeur numérique mais que votre propriété C # est une chaîne, newtonsoft.json peut le gérer de manière transparente, tandis que System.Text.json sautera ces champs [5].
- System.Text.json adhère strictement à la spécification JSON (RFC 8259) et ne prend pas en charge la désérialisation des valeurs numériques dans les propriétés de chaîne ou vice versa sans configuration supplémentaire. Il nécessite des convertisseurs explicites pour gérer de tels scénarios [4] [5].
Character s'échappant
- Newtonsoft.json est moins strict quant à l'échappement des personnages. Il permet à plus de personnages de passer sans échapper, ce qui peut être bénéfique pour certains scénarios mais peut poser des risques de sécurité s'ils ne sont pas gérés correctement [1].
- System.text.json échappe à plus de caractères par défaut, y compris tous les caractères non ASCII et les caractères sensibles à HTML, pour offrir une meilleure protection contre les attaques XSS [1].
Support sur le terrain
- Newtonsoft.json prend directement des champs de sérialisation et de désérialisation directement, ce qui peut être utile dans certains scénarios où les propriétés ne sont pas applicables.
- System.Text.json ne prend pas en charge les champs de sérialisation ou de désérialisation par défaut. Cependant, à partir de .NET 5, vous pouvez activer la sérialisation des champs en définissant `jSonSerializerOptions. y compris les detins« True »ou en utilisant l'attribut` [JSONInclude] `sur des champs spécifiques [3].
Performance
- System.Text.json est généralement plus rapide que Newtonsoft.json, en particulier pour les grands ensembles de données, en raison de son accent sur l'optimisation des performances [9].
Intégration avec mvvmcross
MVVMCross utilise un wrapper autour de Newtonsoft.json pour la sérialisation et la désérialisation JSON. Cela signifie que lorsque vous utilisez MVVMCROSS, vous travaillez probablement par défaut avec le comportement flexible de Newtonsoft.json. Si vous choisissez de passer à System.Text.json, vous devrez ajuster vos paramètres de sérialisation et éventuellement ajouter des convertisseurs personnalisés pour correspondre au comportement dont vous avez besoin [2] [6].
En résumé, tandis que Newtonsoft.json offre une flexibilité et une compatibilité avec un large éventail de scénarios, System.Text.json priorise les performances, la sécurité et l'adhésion stricte aux normes JSON. Le choix entre eux dans mvvmcross dépend de vos exigences spécifiques et si vous avez besoin de la flexibilité de newtonsoft.json ou des performances et de la sécurité de System.Text.json.
Citations:[1] https://learn.microsoft.com/en-us/dotnet/standard/serialization/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-ystem-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-différences
[9] https://www.youtube.com/watch?v=ocwodu8y3si
[10] https://stackoverflow.com/questions/18488310/mvvmcross-desilization-error-for-json
[11] https://www.telerik.com/forums/data-binding-and-serialization-issue-with-ystem-text-json-core-3-0
[12] https://www.reddit.com/r/dotnet/comments/14xgfjl/should_you_use_newtonsoftjson_or_systemtextjson/