将枚举序列化为字符串

21 浏览
0 Comments

将枚举序列化为字符串

我有一个枚举:

public enum Action {
    Remove=1,
    Add=2
}

还有一个类:

[DataContract]
public class Container {
    [DataMember]
    public Action Action {get; set;}
}

当将Container的实例序列化为json时,我得到: {Action:1} (如果Action是Remove的话)。

我想要得到:{Action:Remove}(我需要枚举的ToString形式,而不是整数)。

我可以在类中不添加其他成员的情况下实现吗?

0
0 Comments

将枚举序列化为字符串的问题通常出现在需要将枚举类型的值转换为字符串形式的场景中。下面介绍了解决这个问题的方法。

一种简单的方法是使用JsonConvert类的SerializeObject方法。该方法可以将对象序列化为JSON字符串,并提供了一个参数来指定枚举类型的序列化方式。具体代码如下:

JsonConvert.SerializeObject(myObject, Formatting.Indented, new StringEnumConverter());

这种方法是目前最简单的解决方案之一。通过使用StringEnumConverter,可以将枚举值转换为字符串,并以缩进的形式输出JSON字符串。感谢这个简单的解决方案!

通过使用JsonConvert.SerializeObject方法和StringEnumConverter类,可以将枚举类型的值序列化为字符串。这为解决将枚举转换为字符串的问题提供了一种简单有效的方法。

0
0 Comments

问题的原因:在将枚举类型转化为字符串时,需要使用Json.Net进行序列化。但是Json.Net默认情况下将枚举类型序列化为整数值,而不是字符串。因此,需要自定义一个StringEnumConverter来实现将枚举类型序列化为字符串的功能。

解决方法:可以定义一个继承自StringEnumConverter的自定义转换器,并重写WriteJson方法来实现将枚举类型转化为字符串的功能。在重写的方法中,首先判断要序列化的值是否是枚举类型,如果是,则调用Enum.GetName方法将枚举值转化为对应的字符串值,然后调用基类的WriteJson方法进行序列化。如果不是枚举类型,则调用基类的WriteJson方法进行默认的序列化操作。

具体代码如下:

public class MyStringEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value.GetType().IsEnum) 
        { 
            writer.WriteValue(Enum.GetName(value.GetType(), value)); 
            return; 
        }
        base.WriteJson(writer, value, serializer);
    }
}

然后,在进行序列化时,可以将自定义的转换器传递给JsonConvert.SerializeObject方法的第二个参数,从而实现将枚举类型转化为字符串的功能。

具体代码如下:

string json=JsonConvert.SerializeObject(container,new MyStringEnumConverter());

另外,还可以直接使用"new Newtonsoft.Json.Converters.StringEnumConverter()"作为转换器,这样可以适用于所有的枚举类型,并且能正确反序列化枚举值(尽管不知道为什么,上述自定义的转换器不能正确反序列化枚举值,尽管只是调用了基类的方法)。

综合上述解决方法,可以完美地解决了在多个XML文档解析的使用场景中,将枚举类型序列化为字符串的需求。

0
0 Comments

问题:如何将枚举类型序列化为字符串?

在使用JSON序列化时,有时候我们希望将枚举类型序列化为字符串,而不是默认的整数值。下面给出了解决该问题的方法。

方法一:

可以为不希望被序列化为整数值的枚举属性添加以下特性:

[Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))]

方法二:

如果希望以其他格式呈现枚举属性,可以使用以下特性告诉JSON序列化器仅序列化您按照自己的意愿格式化的属性。具体取决于您的其他实现方式。它还能识别属性上的DataMember属性。

[JsonObject(MemberSerialization = MemberSerialization.OptOut)]
public class Container
{
    public Action Action { get; set; }
    [JsonProperty(PropertyName = "Action")]
    public string ActionString
    {
        get
        {
            return Action.ToString();
        }
    }
}

注意:命名空间稍有变化:

[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]

通过以上两种方法,可以将枚举类型序列化为字符串,以满足特定需求。

0