วิธีบอก Json.Net ทั่วโลกให้ใช้ StringEnumConverter กับ enums ทั้งหมด


84

ฉันต้องการแยกการแจงนับการแทนค่าสตริงและในทางกลับกันด้วย json.net วิธีเดียวที่ฉันสามารถหาเพื่อบอกให้กรอบงานใช้StringEnumConverterคือการใส่คำอธิบายประกอบคุณสมบัติที่เป็นปัญหาดังนี้:

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }

อย่างไรก็ตามในกรณีการใช้งานของฉันการกำหนดค่า json.net ทั่วโลกจะสะดวกกว่ามากเพื่อให้การแจงนับทั้งหมดได้รับ (de) ต่อเนื่องโดยใช้StringEnumConverterคำอธิบายประกอบโดยไม่จำเป็นต้องมีคำอธิบายประกอบเพิ่มเติม

มีวิธีใดบ้างที่จะทำได้เช่นด้วยความช่วยเหลือของประเพณีJsonSerializerSettingsหรือไม่?

คำตอบ:


113

เพิ่มStringEnumConverterลงในJsonSerializerSettingsคอลเลกชัน Converters

เอกสารประกอบ: Serialize กับ JsonConverters


หากคุณต้องการให้ serializer ใช้ camelCasing คุณสามารถตั้งค่านี้ได้เช่นกัน:

SerializerSettings.Converters.Add(
    new StringEnumConverter { CamelCaseText = true });

นี้จะเป็นอันดับที่จะSomeValuesomeValue


ฉันพยายามตั้งค่านี้ใน global.asax.cs ของฉันภายใต้GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsแต่ไม่ได้ผล มีความคิดว่าทำไมถึงเป็นเช่นนั้น?
อา

มีวิธีใดในการพิมพ์ชื่อฟิลด์ให้เล็กลงหรือไม่? แฟล็ก CamelCaseText เป็นแบบฮาร์ดโค้ดในคลาสและฉันไม่เห็นวิธีใช้กลยุทธ์การปลอกแบบอื่น
mikebridge

@mikebridge คุณพบวิธีแก้ปัญหานี้หรือยัง? นอกจากนี้กำลังมองหาวิธีตั้งชื่อสำหรับแต่ละตัวเลือก enum ด้วยตัวเอง (หรือใช้ตัวพิมพ์เล็ก)
Timm

1
@ ทิมใช่ฉันใช้โพสต์นี้: stackoverflow.com/questions/6288660/…
mikebridge

@mikebridge ขอบคุณ ฉันพบว่า [EnumMember (Value = "undefined")] ต่อรายการ enum ใช้งานได้ดีกับ JSON.Net เช่นกัน (แม้ว่าจะไม่รองรับโดยตัวลดขนาด JSON ของ Microsoft)
Timm

40

คำตอบอื่น ๆ ใช้ได้กับ ASP.NET แต่ถ้าคุณต้องการตั้งค่าเหล่านี้โดยทั่วไปสำหรับการเรียก JsonConvert ในบริบทใด ๆ คุณสามารถทำได้:

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
    return settings;
});

(ดูhttp://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data )


2
สิ่งที่ฉันกำลังมองหา! ยิ่งสั้นกว่านี้:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé

คุณช่วยฉันไว้! ขอบคุณครับ! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
crthompson

18

ใน Global.asax.cs ของคุณเพิ่ม

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

ดูเหมือนว่าโซลูชันนี้จะทำงานได้อย่างสมบูรณ์แบบสำหรับ WebAPI serialization ขอบคุณ!
ชาร์ลี

5

สำหรับ ASP.NET Core 2 ให้ทำดังต่อไปนี้:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                });

        ...

โปรดทราบว่านี่ไม่ใช่services.AddJsonOptions(...)ต้องติดแท็กลงใน MVC เนื่องจากคุณกำลังสร้างการตั้งค่าสำหรับ MVC


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.