วิธีการตั้งค่าตัวเลือกเริ่มต้นทั่วโลกสำหรับ System.Text.Json.JsonSerializer?


12

อัปเดต [2019-12-23]: ครบกำหนดในส่วนของอินพุตชุมชนแกนนำปัญหานี้ได้ถูกเพิ่มไปยังแผนงานสำหรับ. NET 5.0

อัปเดต [2019-10-10]: หากสนใจที่จะเห็นพฤติกรรมนี้ถูกนำไปใช้System.Text.Json.JsonSerializerตรงไปที่ปัญหา GitHub แบบเปิดที่ชี้โดยChris Yungmannและชั่งน้ำหนัก


แทนสิ่งนี้:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

ฉันต้องการทำสิ่งนี้:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

ความหวังคือไม่จำเป็นต้องส่งอินสแตนซ์ของJsonSerializerOptionsกรณีทั่วไปของเราและแทนที่สำหรับข้อยกเว้นไม่ใช่กฎ

ตามที่ระบุไว้ในคำถาม& ข้อนี้เป็นคุณสมบัติที่มีประโยชน์ของ Json.Net ผมมองในเอกสารสำหรับSystem.Text.Jsonเช่นเดียวกับนี้ repo GitHubสำหรับ NET หลัก และหนึ่งในนี้

ดูเหมือนจะไม่เป็นแบบอะนาล็อกสำหรับการจัดการค่าเริ่มต้นการทำให้เป็นอันดับ JSON ใน. NET Core 3 หรือฉันจะมองเห็นมัน?


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3- คุณกำลังพูดถึงคำขอเข้าและออกจาก API ของคุณหรือไม่ หรือคำขอและการตอบสนองต่อทรัพยากรอื่น ๆ ?
ps2goat

@ ps2goat ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณ สิ่งที่นี่คือ (de) สตริง JSON ที่ทำให้เป็นอนุกรม พวกเขาอาจมาจากแหล่งที่มาจำนวนเท่าใดก็ได้
Trevor Reid

ฉันถูกถามเพราะมีสถานที่พิเศษในระหว่างการเริ่มต้นสำหรับตัวจัดรูปแบบอินพุตและเอาต์พุต (เช่นสำหรับการเชื่อมโยงโมเดล)
5252

อ้า gotcha ในแง่นั้นฉันคิดว่ากรณีของเราจะตกอยู่ภายใต้ "ทรัพยากรอื่น ๆ " @ ps2goat
Trevor Reid

มันน่าเศร้าจริงๆจนกระทั่ง. net core 3.1 ยังไม่มี json serializer ในตัวที่ดี
โจ๊กหวง

คำตอบ:


4

ไม่มี, JsonSerializerOptionsไม่เปิดเผยตัวเลือกเริ่มต้น หากคุณใช้เว็บเฟรมเวิร์กเฉพาะอาจมีวิธีการระบุ (ไม่) การตั้งค่าการทำให้เป็นอันดับ มิฉะนั้นฉันขอแนะนำให้สร้างวิธีการอำนวยความสะดวกของคุณเอง

ดูยังเปิดประเด็นนี้


3

คุณสามารถสร้างวิธีการขยายได้ นี่คือตัวอย่าง

ฉันใช้วิธีแยกต่างหากและต้องสร้างการตั้งค่าพิเศษเพื่อให้การตั้งค่าทั้งหมดอยู่ในจุดเดียวและสามารถนำมาใช้ซ้ำได้ง่าย

public static class DeserializeExtensions
{
    private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();

    // set this up how you need to!
    private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();


    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
    }

    public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
    {
        return JsonSerializer.Deserialize<T>(json, settings);
    }

    public static T DeserializeFeatureX<T>(this string json)
    {
        return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
    }
}

จากนั้นคุณเรียกมันว่าเป็นวิธีการในสตริงไม่ว่าจะเป็นตัวอักษรหรือตัวแปร

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();

อาคุณเป็นคำตอบที่ขึ้นอยู่กับ Json.Net ฉันคิดว่า คำถามนี้เกี่ยวกับSystem.Text.Json.JsonSerializerin NET Core-3.0 โดยไม่มีการอ้างอิงเพิ่มเติม ขอบคุณ
Trevor Reid

2
นั่นคือความงามของสิ่งที่เป็นนามธรรม ไม่มีการเปลี่ยนแปลงรหัสนอกคลาสส่วนขยายนี้! ฉันเพิ่งอัปเดตเป็นตัวSystem.Text.Json.JsonSerializerต่อ แนวคิดนั้นเหมือนกันทุกประการ ฉันอัปเดตลิงค์ตัวอย่างด้วย
ps2goat

3

ตัวเลือกเริ่มต้นจะไม่เปิดเผยJsonSerializerสำหรับ. NET Core 3.1 อย่างไรก็ตาม ณ เดือนธันวาคม 2019 สิ่งนี้ได้ถูกเพิ่มเข้าไปในแผนที่ถนนสำหรับ 5.0

การเปิดตัว. NET 5.0 คาดว่าจะมีขึ้นในเดือนพฤศจิกายน 2563 แต่ไม่มีการรับประกันว่าปัญหานี้จะได้รับการแก้ไขในเวลาใดก็ได้ นอกเหนือจากการรอคำตอบเหล่านี้แนะนำการแก้ไขปัญหา:



-1

(หากคุณเคยเปลี่ยนมาใช้ Json.NET)

ฉันชอบและให้คำแนะนำเป็นอย่างชัดเจนและผ่านการตั้งค่าการโทรทั้งหมด แต่คุณสามารถตั้งค่าเริ่มต้นกับDefaultSettings

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

แล้ว

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);

คำตอบและลิงค์โดย @tymtam นี้ใช้กับ Json.Net คำถามของพวกเขาเกี่ยวข้องกับพฤติกรรม simialr System.Text.Jsonซึ่งเป็นอนุกรม JSON อบใน. NET Core 3.0 ขอบคุณที่สละเวลาตอบ
Trevor Reid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.