我有一个包含枚举属性的类,在使用JavaScriptSerializer序列化对象时,我的json结果包含枚举的整数值,而不是它的字符串“name”。有没有一种方法来获得枚举作为字符串在我的json而不必创建一个自定义JavaScriptConverter?也许有一个属性,我可以装饰枚举定义,或对象属性?

举个例子:

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }
    Gender Gender { get; set; }
}

期望的JSON结果:

{ "Age": 35, "Gender": "Male" }

理想情况下,用内置的。net框架类来寻找答案,如果没有可能的替代方案(如Json.net)也是受欢迎的。


当前回答

将以下内容添加到全局中。asax用于JSON序列化c# enum为字符串

  HttpConfiguration config = GlobalConfiguration.Configuration;
            config.Formatters.JsonFormatter.SerializerSettings.Formatting =
                Newtonsoft.Json.Formatting.Indented;

            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

其他回答

没有什么特殊属性可以使用。JavaScriptSerializer将枚举序列化为它们的数值而不是它们的字符串表示。您需要使用自定义序列化将枚举序列化为其名称而不是数值。


如果可以使用JSON。JSON.net涵盖了这个用例(通过属性[JsonConverter(typeof(StringEnumConverter))])和其他许多内建的。Net序列化器无法处理的用例。下面是一个比较序列化器特性和功能的链接。

你可以使用内置的JavaScriptSerializer来实现这个功能。通过将枚举转换为Uri,可以将其编码为字符串。

我已经描述了如何对日期执行此操作,但它也可以用于枚举。 自定义DateTime JSON格式。net JavaScriptSerializer。

ASP。只需添加以下到你的启动类:

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

Asp。Net Core 3与System.Text.Json

public void ConfigureServices(IServiceCollection services)
{

    services
        .AddControllers()
        .AddJsonOptions(options => 
           options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())
        );

    //...
 }

您可以通过调用JsonConverter来创建JsonSerializerSettings。SerializeObject如下:

var result = JsonConvert.SerializeObject
            (
                dataObject,
                new JsonSerializerSettings
                {
                    Converters = new [] {new StringEnumConverter()}
                }
            );