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


当前回答

        Person p = new Person();
        p.Age = 35;
        p.Gender = Gender.Male;
        //1.  male="Male";
        string male = Gender.Male.ToString();

        p.Gender = Gender.Female;

        //2.  female="Female";
        string female = Enum.GetName(typeof(Gender), p.Gender);

        JObject jobj = new JObject();
        jobj["Age"] = p.Age;
        jobj["Gender"] = male;
        jobj["Gender2"] = female;

        //you result:  josn= {"Age": 35,"Gender": "Male","Gender2": "Female"}
        string json = jobj.ToString();

其他回答

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

class Person
{
    int Age { get; set; }

    [ScriptIgnore]
    Gender Gender { get; set; }

    string GenderString { get { return Gender.ToString(); } }
}
        Person p = new Person();
        p.Age = 35;
        p.Gender = Gender.Male;
        //1.  male="Male";
        string male = Gender.Male.ToString();

        p.Gender = Gender.Female;

        //2.  female="Female";
        string female = Enum.GetName(typeof(Gender), p.Gender);

        JObject jobj = new JObject();
        jobj["Age"] = p.Age;
        jobj["Gender"] = male;
        jobj["Gender2"] = female;

        //you result:  josn= {"Age": 35,"Gender": "Male","Gender2": "Female"}
        string json = jobj.ToString();

这个版本的Stephen的回答没有改变JSON中的名称:

[DataContract(
    Namespace = 
       "http://schemas.datacontract.org/2004/07/Whatever")]
class Person
{
    [DataMember]
    int Age { get; set; }

    Gender Gender { get; set; }

    [DataMember(Name = "Gender")]
    string GenderString
    {
        get { return this.Gender.ToString(); }
        set 
        { 
            Gender g; 
            this.Gender = Enum.TryParse(value, true, out g) ? g : Gender.Male; 
        }
    }
}

我发现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)构造函数来控制大小写和数字是否仍然被接受。

我不能像顶部答案(@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()
        }
    })