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


当前回答

我发现Json。NET提供了我正在寻找的StringEnumConverter属性的确切功能:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

更多详细信息请参见StringEnumConverter文档。

还有其他地方可以更全局地配置这个转换器:

如果你想让Enum总是被序列化/反序列化为string,则枚举本身: [JsonConverter typeof (StringEnumConverter))) enum性别{男,女} 如果有人想避免属性修饰,你可以将转换器添加到你的JsonSerializer(由Bjørn Egil建议): serializer.Converters。添加(新Newtonsoft.Json.Converters.StringEnumConverter ()); 并且它将为它在序列化期间看到的每个枚举工作(由Travis建议)。 或者JsonConverter(由banana建议): JsonConvert。SerializeObject (MyObject 新的Newtonsoft.Json.Converters.StringEnumConverter ());

此外,你可以通过使用StringEnumConverter(NamingStrategy, Boolean)构造函数来控制大小写和数字是否仍然被接受。

其他回答

ASP。NET核心方式:

public class Startup
{
  public IServiceProvider ConfigureServices(IServiceCollection services)
  {
    services.AddMvc().AddJsonOptions(options =>
    {
      options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
    });
  }
}

https://gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e

我发现Json。NET提供了我正在寻找的StringEnumConverter属性的确切功能:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

更多详细信息请参见StringEnumConverter文档。

还有其他地方可以更全局地配置这个转换器:

如果你想让Enum总是被序列化/反序列化为string,则枚举本身: [JsonConverter typeof (StringEnumConverter))) enum性别{男,女} 如果有人想避免属性修饰,你可以将转换器添加到你的JsonSerializer(由Bjørn Egil建议): serializer.Converters。添加(新Newtonsoft.Json.Converters.StringEnumConverter ()); 并且它将为它在序列化期间看到的每个枚举工作(由Travis建议)。 或者JsonConverter(由banana建议): JsonConvert。SerializeObject (MyObject 新的Newtonsoft.Json.Converters.StringEnumConverter ());

此外,你可以通过使用StringEnumConverter(NamingStrategy, Boolean)构造函数来控制大小写和数字是否仍然被接受。

这很容易做到,只需向Gender属性添加一个ScriptIgnore属性,使其不被序列化,并添加一个被序列化的GenderString属性:

class Person
{
    int Age { get; set; }

    [ScriptIgnore]
    Gender Gender { get; set; }

    string GenderString { get { return Gender.ToString(); } }
}

下面是newtonsoft.json的答案

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }

    [JsonConverter(typeof(StringEnumConverter))]
    Gender Gender { get; set; }
}

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

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

希望这能帮助到一些人。