我有一个包含枚举属性的类,在使用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)也是受欢迎的。


当前回答

对于VB.net,我找到了以下作品:

Dim sec = New Newtonsoft.Json.Converters.StringEnumConverter()
sec.NamingStrategy() = New Serialization.CamelCaseNamingStrategy

Dim JSON_s As New JsonSerializer
JSON_s.Converters.Add(sec)

Dim jsonObject As JObject
jsonObject = JObject.FromObject(SomeObject, JSON_s)
Dim text = jsonObject.ToString

IO.File.WriteAllText(filePath, text)

其他回答

我不能像顶部答案(@ob.)那样更改源模型,而且我不想像@Iggy那样全局注册它。所以我结合https://stackoverflow.com/a/2870420/237091和@Iggy的https://stackoverflow.com/a/18152942/237091,以允许在SerializeObject命令本身上设置字符串enum转换器:

Newtonsoft.Json.JsonConvert.SerializeObject(
    objectToSerialize, 
    Newtonsoft.Json.Formatting.None, 
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        Converters = new List<Newtonsoft.Json.JsonConverter> {
            new Newtonsoft.Json.Converters.StringEnumConverter()
        }
    })

这是一个老问题,但以防万一,我想我还是要发表一下。在我的项目中,我为任何Json请求使用单独的模型。模型通常具有与域对象相同的名称,并以“Json”为前缀。模型使用AutoMapper进行映射。通过让json模型声明一个在域类上是enum的字符串属性,AutoMapper将解析为它的字符串表示形式。

如果你想知道,我需要为Json序列化类单独的模型,因为内置的序列化器会提出循环引用,否则。

希望这能帮助到一些人。

对于。net Core:-

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddJsonFormatters(f => f.Converters.Add(new StringEnumConverter()));
    ...
}

对于。net 6.0,如果你想使用内置的JsonSerializer (System.Text.Json)

然后,它是开箱即用的,你只需要使用内置的JsonStringEnumConverter属性。例如:

[JsonConverter(typeof(JsonStringEnumConverter))]
public SomeEnumType EnumProperty { get; set; }

就是这样,但是要确保你的SomeEnumType包含了精确的字符串值,否则它会抛出异常。套管似乎不敏感。

参考:https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-customize-properties?pivots=dotnet-6-0 # enums-as-strings

我用牛顿软件把这个解的所有部分都拼在了一起。Json库。它修复了枚举问题,也使错误处理变得更好,并且它在IIS托管服务中工作。这是相当多的代码,所以你可以在GitHub上找到它:https://github.com/jongrant/wcfjsonserializer/blob/master/NewtonsoftJsonFormatter.cs

您必须向Web添加一些条目。配置让它工作,你可以在这里看到一个例子文件: https://github.com/jongrant/wcfjsonserializer/blob/master/Web.config