การเพิ่ม JsonConvertorFactory ไปยังแอพ Blazor Web Assembly
ใหม่สำหรับ Blazor ใหม่สำหรับ Web Assembly ซึ่งเป็น. NET Core ไม่ใช่ใหม่สำหรับ. NET (ตั้งแต่ 1.0)
ฉันกำลังทำขั้นตอนแรกในการเรียนรู้ Blazor - ส่วนใหญ่ฉันเป็นผู้พัฒนาแบ็คเอนด์และวินฟอร์มไม่ใช่ฝั่งไคลเอ็นต์
สำหรับโครงการของฉันฉันกำลังสร้างไคลเอ็นต์ Blazor Web Assembly ที่เข้าถึงฟังก์ชันการทำงานที่มีอยู่บางอย่างที่ฉันได้ปรับใช้ผ่าน Azure Functions 3 ฉันต้องการแชร์ POCO บางส่วนระหว่างแอปส่วนหน้าและส่วนหลัง
ฉันพบ "ความต้านทานไม่ตรงกัน" ระหว่างแอป Blazor และแอปฟังก์ชัน Azure ทั้งสองแอป (Blazor และ Functions) เป็นแอป "นอกกรอบ" พื้นฐานซึ่งกำหนดค่าตามวิธีที่เทมเพลตโครงการใหม่ใน VS2019 สร้างขึ้น
- แอปฟังก์ชัน Azure กำหนดเป้าหมาย "netcoreapp3.1" ในขณะที่แอปฝั่งไคลเอ็นต์ Blazor กำหนดเป้าหมาย "netstandard2.1"
- Azure Functions ใช้
Newtonsoft.Jsonในขณะที่ Blazor ใช้System.Text.Json
ในการแบ่งปันคำจำกัดความของวัตถุฉันเปลี่ยนไลบรารีคลาสที่มี POCO ของฉันเป็น netstandard2.1 และดูเหมือนจะใช้ได้ นี่เป็นวิธีแก้ปัญหาที่ถูกต้องหรือไม่?
ปัญหาที่ฉันไม่สามารถเอาชนะได้คือวัตถุที่มีenumคุณสมบัติจะถูกส่งคืนจากแอป Azure Functions Deserialization ของอ็อบเจ็กต์นี้ล้มเหลวในแอพ Blazor เมื่อพบค่า enum ในข้อความ JSON
ฉันSystem.Text.Jsonจะเรียกคืนenumคุณสมบัติได้อย่างไร
ฉันได้เห็นตัวอย่างวิธีการเพิ่ม a JsonConvertorFactoryใน ASP.NET Core แล้ว แต่ยังไม่ชัดเจนว่าตัวอย่างเหล่านั้นใช้อย่างไรในแอป Blazor ยกตัวอย่างเช่นที่นี่
ในNewtsoft.Jsonด้าน POCOs ได้รับการตกแต่งด้วยNewtonsoft.Json.JsonConvertorแอตทริบิวต์ ฉันพยายามเพิ่มSystem.Text.Jsonแอตทริบิวต์ตัวแปลงที่เกี่ยวข้อง แต่ไม่พบคลาสนั้น - System.Text.Jsonไม่ใช่ส่วนหนึ่งของ netstandard2.1?
คำตอบ
ฉันเปลี่ยนไลบรารีคลาสที่มี POCO ของฉันเป็น netstandard2.1 และดูเหมือนจะใช้ได้ นี่เป็นวิธีแก้ปัญหาที่ถูกต้องหรือไม่?
ใช่ว่าจะดี
และฉันรู้ว่าคุณสามารถเพิ่ม NewtonSoft ลงในแอป Blazor ได้เพียงแค่เพิ่มขนาดเล็กน้อย
ในอีกด้านหนึ่งฉันไม่แน่ใจว่า Azure Functions นั้นเชื่อมโยงกับ NewtonSoft อย่างมากคุณไม่เพียง แต่ทำงานกับ HttpRequest และ HttpResponse หรือไม่? ที่ควรจะทำงานกับ System.Text.Json เช่นกัน
ดังนั้นคุณควรจะสามารถใช้ Json lib เดียวกันได้ทั้งสองด้าน
System.Text.Json ไม่ใช่ส่วนหนึ่งของ netstandard2.1 หรือไม่
ไม่ใช่ 'ส่วนหนึ่งของ' แต่เป็น 'รองรับบน' คุณสามารถแก้ไขปัญหานี้ได้ (หากยังจำเป็น) โดยเพิ่มแพ็กเกจที่เหมาะสมในโปรเจ็กต์ของคุณ
ประการแรกใกล้อย่างที่ฉันสามารถบอกได้ไม่มีจุดศูนย์กลางในการตั้งค่าตัวเลือกการทำให้เป็นอนุกรม Json ใน Blazor WebAssembly - ที่ดีที่สุดที่ฉันบอกได้คุณต้องตั้งค่าตัวเลือกทุกที่ที่ใช้ serialization / deserialization หวังว่าจะมีคนลบล้างความคิดนั้นให้ฉันได้ ที่ฉันพลาดไป (ฉันสมมติว่ามีอินสแตนซ์เริ่มต้นของJsonSerializerOptionsตัวเลือกอยู่ที่ไหนสักแห่ง แต่ฉันไม่พบ)
นี่คือวิธีแก้ไขเบื้องต้น:
var jso = new System.Text.Json.JsonSerializerOptions()
{
PropertyNameCaseInsensitive = true
};
jso.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
var sc = await Http.GetFromJsonAsync<YourResultType>(yourUrl, jso);
ที่ได้รับenumค่าที่แยกวิเคราะห์อย่างถูกต้อง
พบปัญหาใหม่ในขณะนี้ ฉันคิดว่ามันเป็นค่าว่างสำหรับNullableประเภทค่า (เช่นdouble?) แต่ฉันคิดผิด - มันเป็นค่า NaN - เห็นได้ชัดว่าNewstonsoft.Jsonเข้าใจค่านั้นในขณะที่System.Text.Jsonไม่ทำ ฉันจะพิจารณาว่ามีข้อบกพร่องในแหล่งข้อมูลของฉันและแก้ไขเพื่อไม่ให้คืนค่า NaN (นั่นคือสาเหตุที่คุณสมบัตินั้นเป็นหลังdouble?)
UPDATEดูที่ซอร์สโค้ดเพราะHttpClientJsonExtensions.GetFromJsonAsyncชัดเจนว่าไม่มีค่าเริ่มต้นส่วนกลางที่สามารถตั้งค่าได้ วิธีแก้ปัญหาข้างต้นในการส่งผ่านJsonSerializerOptionsไปยังทุกสายที่GetFromJsonAsyncดูเหมือนจะเป็นวิธีแก้ปัญหาที่ถูกต้องในเวลานี้