MVVMCross의 맥락에서 NewTonsoft.json 및 System.text.json을 비교할 때 크로스 플랫폼 응용 프로그램에서 JSON 직렬화 및 사태화를 처리하는 방법에 영향을 줄 수있는 몇 가지 주요 차이점이 나타납니다.
기본 동작
-newtonsoft.json은 기본적으로 더 유연하고 용서합니다. 그것은 사례에 민감한 속성 이름 일치를 지원하므로 JSON 문자열의 속성 이름이 C# 클래스의 속성 사례와 정확히 일치하지 않더라도 JSON을 사정화 할 수 있습니다. 이 유연성은 케이싱이 일관되지 않을 수있는 소스의 데이터를 처리하는 데 유리합니다 [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은 XSS 공격에 대한 더 나은 보호를 제공하기 위해 모든 비 ASCII 문자 및 HTML에 민감한 문자를 포함하여 기본적으로 더 많은 문자를 탈출합니다 [1].
필드 지원
-newtonsoft.json은 직렬화 및 사막화 필드를 직접 지원하며, 이는 속성이 적용되지 않는 특정 시나리오에서 유용 할 수 있습니다.
-System.text.json은 기본적으로 직렬화 또는 필사적 인 필드를 지원하지 않습니다. 그러나 .NET 5에서 시작하여`jsonserializeroptions.includefields`를 'true'로 설정하거나 특정 필드에서`[jsoninclude]`속성을 사용하여 필드 직렬화를 활성화 할 수 있습니다 [3].
성능
-System.text.json은 성능 최적화에 중점을두기 때문에 일반적으로 NewTonsoft.json, 특히 대규모 데이터 세트의 경우 일반적으로 빠릅니다 [9].
MVVMCross와의 통합
MVVMCross는 JSON 직렬화 및 사막화를 위해 NewTonsoft.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-us-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-text-json-core-3-0
[12] https://www.reddit.com/r/dotnet/comments/14xgfjl/should_you_use_newtonsoftjson_or_systemtextjson/