2011-09-15 29 views
75

Tôi muốn deserialize liệt kê để đại diện chuỗi của họ và ngược lại với json.net. Cách duy nhất tôi có thể tìm ra nói với khuôn khổ để áp dụng nó StringEnumConverter là để chú thích các thuộc tính trong câu hỏi như thế này:Làm thế nào để yêu cầu Json.Net trên toàn cầu áp dụng StringEnumConverter cho tất cả các enums

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

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

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

Trả lời

106

Thêm StringEnumConverter vào bộ sưu tập chuyển đổi JsonSerializerSettings.

Tài liệu: Serialize with JsonConverters


Nếu bạn muốn sử dụng serializer camelCasing, bạn có thể thiết lập này cũng như:

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

này sẽ serialize SomeValue-someValue.

+0

Tôi đã thử đặt cài đặt này trên global.asax.cs của mình trong 'GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings'but không hoạt động. Bất kỳ ý tưởng tại sao có thể? – amhed

+0

Có cách nào để viết hoa 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ách sử dụng một chiến lược vỏ khác. – mikebridge

+0

@mikebridge Bạn đã tìm ra giải pháp cho điều này chưa? Ngoài ra tìm kiếm một cách để đặt tên cho mỗi tùy chọn enum bản thân mình (hoặc sử dụng chữ thường). – Timm

18

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

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

Giải pháp này dường như hoạt động hoàn hảo cho việc serialization WebAPI. Cảm ơn! – chuck

34

Những câu trả lời khác làm việc cho ASP.NET, nhưng nếu bạn muốn thiết lập các thiết lập chung cho gọi JsonConvert trong bất kỳ bối cảnh mà bạn có thể làm:

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)

+1

Điều tôi đang tìm kiếm! Thậm chí ngắn hơn: 'JsonConvert.DefaultSettings =() => new JsonSerializerSettings { Trình biến đổi = {new StringEnumConverter {CamelCaseText = true}} };' –

0

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

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

     ... 

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

Các vấn đề liên quan