При сравнении Newtonsoft.json и System.text.json в контексте MVVMcross появляются несколько ключевых различий, которые могут повлиять на то, как вы обрабатываете сериализацию и десериализацию JSON в ваших кроссплатформенных приложениях.
поведение по умолчанию
- Newtonsoft.json более гибкий и прощающий по умолчанию. Он поддерживает нечувствительное соответствие имени свойств, что означает, что он может десериализировать JSON, даже если имена свойств в строке JSON не совсем соответствуют случаю свойств в вашем классе C#. Эта гибкость полезна для обработки данных из источников, где корпус может быть не согласован [1] [4].
- System.text.json, с другой стороны, строга и чувствителен к корпусу по умолчанию. Это требует точных совпадений между именами свойств JSON и именами свойств C#, что может привести к ошибкам десериализации, если случаи не совпадают. Однако эта строгость повышает производительность и безопасность [1] [4].
сериализация и десериализация
- Newtonsoft.json обеспечивает более снисходительную сериализацию и десериализацию. Например, он может преобразовать числовые значения в свойства строки и наоборот, что невозможно при System.text.json из коробки. Это означает, что если ваш JSON содержит числовое значение, но ваше свойство C# является строкой, Newtonsoft.JSON может справиться с ним плавно, тогда как System.Text.JSON пропустит такие поля [5].
- System.Text.JSON строго придерживается спецификации JSON (RFC 8259) и не поддерживает десериализацию числовых значений в свойства строки или наоборот без дополнительной конфигурации. Это требует явных преобразователей для обработки таких сценариев [4] [5].
персонаж сбегает
- Newtonsoft.json менее строги в отношении сбега персонажа. Это позволяет большему количеству символов проходить без ухода, что может быть полезным для определенных сценариев, но может представлять риски безопасности, если не управлять должным образом [1].
-System.Text.JSON по умолчанию убирает больше символов, включая все не ASCII символы и HTML-чувствительные символы, чтобы обеспечить лучшую защиту от атак XSS [1].
Полевая поддержка
- Newtonsoft.json поддержает сериализацию и дезиализацию поля напрямую, что может быть полезно в определенных сценариях, где свойства не применимы.
- System.Text.JSON не поддерживает сериализацию или потери по умолчанию. Однако, начиная с .NET 5, вы можете включить сериализацию поля, установив `jsonserializeroptions.includefields` на` true` или, используя атрибут `[jsoninclude]` на определенных полях [3].
Производительность
- System.text.json, как правило, быстрее, чем Newtonsoft.json, особенно для крупных наборов данных, из -за ее внимания к оптимизации производительности [9].
Интеграция с mvvmcross
Mvvmcross использует обертку вокруг Newtonsoft.json для сериализации и десериализации JSON. Это означает, что при использовании MVVMcross вы, вероятно, работаете с гибким поведением Newtonsoft.json по умолчанию. Если вы решите переключиться на System.text.json, вам нужно настроить настройки сериализации и, возможно, добавить пользовательские преобразователи, чтобы соответствовать необходимому вам поведение [2] [6].
Таким образом, в то время как Newtonsoft.json предлагает гибкость и совместимость с широким спектром сценариев, System.text.json приоритет производительности, безопасности и строгой приверженности стандартам JSON. Выбор между ними в MVVMcross зависит от ваших конкретных требований и того, нужна ли вам гибкость Newtonsoft.json или производительность и безопасность System.text.json.
Цитаты:[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-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-diffferences
[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-siling-and-serialization-issue-with-system-text-json-core-3-0
[12] https://www.reddit.com/r/dotnet/comments/14xgfjl/should_you_use_newtonsoftjson_or_systemtextjson/