Cách thông báo cho Json.Net trên toàn cầu áp dụng StringEnumConverter cho tất cả các enums


84

Tôi muốn giải mã hóa các liệt kê thành biểu diễn chuỗi của chúng và ngược lại với json.net. Cách duy nhất tôi có thể tìm ra để yêu cầu khuôn khổ áp dụng nó StringEnumConverterlà chú thích các thuộc tính được đề cập như sau:

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

Tuy nhiên, trong trường hợp sử dụng của tôi, sẽ thuận tiện hơn nhiều nếu định cấu hình json.net trên toàn cầu sao cho tất cả các bảng liệt kê được (de) tuần tự hóa bằng cách sử dụng StringEnumConvertermà không cần thêm chú thích.

Có cách nào để làm như vậy, ví dụ như với sự trợ giúp của tùy chỉnh JsonSerializerSettings?

Câu trả lời:


113

Thêm a StringEnumConvertervào JsonSerializerSettingsbộ sưu tập Người chuyển đổi.

Tài liệu: Serialize với JsonConverters


Nếu bạn muốn bộ nối tiếp sử dụng camelCasing, bạn cũng có thể đặt điều này:

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

Điều này sẽ tuần tự SomeValueđến someValue.


Tôi đã thử đặt điều này trên global.asax.cs của mình GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsnhưng không hoạt động. Bất kỳ ý tưởng tại sao điều đó có thể được?
sáng

Có cách nào để viết thường tên trường không? Cờ CamelCaseText được mã hóa cứng vào lớp và tôi không thấy có cách nào để sử dụng chiến lược viết hoa khác.
mikebridge

@mikebridge Bạn đã tìm ra giải pháp cho vấn đề này chưa? Cũng đang tìm cách tự đặt tên cho từng tùy chọn enum (hoặc sử dụng chữ thường).
Timm

1
@Timm Có, tôi đã sử dụng bài đăng này: stackoverflow.com/questions/6288660/…
mikebridge

@mikebridge Cảm ơn. Tôi thấy rằng [EnumMember (Value = "undefined")] trên mỗi mục nhập enum cũng hoạt động tốt với JSON.Net (mặc dù không được hỗ trợ bởi bộ giải mã JSON của Microsoft)
Timm

40

Các câu trả lời khác hoạt động cho ASP.NET, nhưng nếu bạn muốn đặt các cài đặt này nói chung để gọi JsonConvert trong bất kỳ ngữ cảnh nào, bạn có thể thực hiện:

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

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


2
Những gì tôi đang tìm kiếm! Thậm chí ngắn hơn:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé

Bạn đã cứu tôi! Cảm ơn nhé người anh em! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
paqogomez 19/03

18

Trong phần thêm Global.asax.cs của bạn

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

Giải pháp này dường như hoạt động hoàn hảo cho việc tuần tự hóa WebAPI. Cảm ơn!
charlie

5

Đối với ASP.NET Core 2, hãy làm như sau:

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

        ...

Xin lưu ý rằng điều này không phải services.AddJsonOptions(...), nó phải được gắn thẻ vào MVC vì bạn đang tạo cài đặt cho MVC.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.