เมื่อเปรียบเทียบ newtonsoft.json และ system.text.json ในบริบทของ mvvmcross ความแตกต่างที่สำคัญหลายประการเกิดขึ้นที่อาจส่งผลกระทบต่อวิธีที่คุณจัดการกับการทำให้เป็นอนุกรม JSON และ deserialization ในแอปพลิเคชันข้ามแพลตฟอร์มของคุณ
พฤติกรรมเริ่มต้น
- Newtonsoft.json มีความยืดหยุ่นและให้อภัยมากขึ้นโดยค่าเริ่มต้น รองรับการจับคู่ชื่อคุณสมบัติที่ไม่ได้รับการตอบสนองซึ่งหมายความว่าสามารถ deserialize JSON ได้แม้ว่าชื่อคุณสมบัติในสตริง JSON จะไม่ตรงกับกรณีของคุณสมบัติในคลาส C# ของคุณ ความยืดหยุ่นนี้เป็นประโยชน์สำหรับการจัดการข้อมูลจากแหล่งที่ปลอกอาจไม่สอดคล้องกัน [1] [4]
- System.Text.json ในทางกลับกันมีความเข้มงวดและมีความอ่อนไหวเป็นค่าเริ่มต้น มันต้องการการจับคู่ที่แน่นอนระหว่างชื่อคุณสมบัติ JSON และชื่อคุณสมบัติ C# ซึ่งอาจนำไปสู่ข้อผิดพลาด deserialization หากกรณีไม่ตรงกัน อย่างไรก็ตามความเข้มงวดนี้ช่วยเพิ่มประสิทธิภาพและความปลอดภัย [1] [4]
การทำให้เป็นอนุกรมและ deserialization
- newtonsoft.json อนุญาตให้มีการทำให้เป็นอนุกรมและ deserialization มากขึ้น ตัวอย่างเช่นมันสามารถแปลงค่าตัวเลขเป็นคุณสมบัติสตริงและในทางกลับกันซึ่งเป็นไปไม่ได้กับ system.text.json ออกจากกล่อง ซึ่งหมายความว่าหาก JSON ของคุณมีค่าตัวเลข แต่คุณสมบัติ C# ของคุณเป็นสตริง newtonsoft.json สามารถจัดการได้อย่างราบรื่นในขณะที่ system.text.json จะข้ามเขตข้อมูลดังกล่าว [5]
- System.Text.JSON ติดตามอย่างเคร่งครัดกับข้อกำหนด JSON (RFC 8259) และไม่รองรับค่าตัวเลข deserializing ลงในคุณสมบัติสตริงหรือในทางกลับกันโดยไม่มีการกำหนดค่าเพิ่มเติม มันต้องการตัวแปลงที่ชัดเจนเพื่อจัดการกับสถานการณ์ดังกล่าว [4] [5]
ตัวละครหลบหนี
- Newtonsoft.json มีความเข้มงวดน้อยเกี่ยวกับการหลบหนีของตัวละคร ช่วยให้ตัวละครผ่านไปได้โดยไม่ต้องหลบหนีซึ่งอาจเป็นประโยชน์สำหรับสถานการณ์บางอย่าง แต่อาจมีความเสี่ยงด้านความปลอดภัยหากไม่ได้รับการจัดการอย่างถูกต้อง [1]
-System.Text.json หลบหนีอักขระได้มากขึ้นโดยค่าเริ่มต้นรวมถึงอักขระที่ไม่ใช่ ASCII ทั้งหมดและอักขระที่ไวต่อ HTML เพื่อให้การป้องกันที่ดีขึ้นจากการโจมตี XSS [1]
การสนับสนุนฟิลด์ ###
- Newtonsoft.json รองรับฟิลด์ Serializing และ Deserializing โดยตรงซึ่งอาจเป็นประโยชน์ในบางสถานการณ์ที่ไม่สามารถใช้คุณสมบัติได้
- System.Text.json ไม่รองรับฟิลด์ที่เป็นอนุกรมหรือ deserializing ตามค่าเริ่มต้น อย่างไรก็ตามเริ่มต้นจาก. NET 5 คุณสามารถเปิดใช้งานการจัดลำดับภาคสนามได้โดยการตั้งค่า `jonserializeroptions.includefields` เป็น` true 'หรือโดยใช้แอตทริบิวต์ `[jsoninclude]` แอตทริบิวต์ในเขตข้อมูลเฉพาะ [3]
ผลงาน
- System.Text.json โดยทั่วไปเร็วกว่า newtonsoft.json โดยเฉพาะอย่างยิ่งสำหรับชุดข้อมูลขนาดใหญ่เนื่องจากมุ่งเน้นไปที่การเพิ่มประสิทธิภาพประสิทธิภาพ [9]
การรวมเข้ากับ mvvmcross
MVVMCROSS ใช้ wrapper รอบ newtonsoft.json สำหรับการจัดลำดับ JSON และ deserialization ซึ่งหมายความว่าเมื่อใช้ 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/