Порівнюючи newtonsoft.json and 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-differences
[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/should_you_use_newtonsoftjson_or_systemtextjson/