在 JSON (C#) 中序列化枚举值 [重复]

Posted

技术标签:

【中文标题】在 JSON (C#) 中序列化枚举值 [重复]【英文标题】:Serializing enum values in JSON (C#) [duplicate] 【发布时间】:2011-12-18 20:51:47 【问题描述】:

可能重复:JSON serialization of c# enum as string

我有两个类如下:

Transaction
    int OrderNumber
    // ... snip ...
    IEnumerable<Item> Items

Item
    string Sku
    // ... snip ...
    ItemCategory Category

ItemCategory 是一个如下所示的枚举:

[DataContract]
public enum ItemCategory

    [EnumMember(Value = "Category1")]
    Category1,

    [EnumMember(Value = "Category2")]
    Category2

我的两个类根据需要使用 DataContract 和 DataMember 属性进行装饰。

我正在尝试获取 Transaction 项的 JSON 表示。在 Transaction 中,我有一个如下所示的公共方法:

public string GetJsonRepresentation()

    string jsonRepresentation = string.Empty;

    DataContractJsonSerializer serializer = new DataContractJsonSerializer(this.GetType());
    using (MemoryStream memoryStream = new MemoryStream())
    
        serializer.WriteObject(memoryStream, this);
        jsonRepresentation = Encoding.Default.GetString(memoryStream.ToArray());   
    

    return jsonRepresentation;

这将返回一个如下所示的字符串:


    "OrderNumber":123,
    "Items":["SKU": "SKU1","Category": 0]

这就是我想要的,除了每个 Item 的“Category”枚举值被序列化为其整数值,而不是我在 EnumMember 属性中指定的值。我怎样才能让返回的 JSON 看起来像 "Category": "Category1" 而不是 "Category": 0?

【问题讨论】:

【参考方案1】:

请查看堆栈溢出中的JSON serialization of enum as string。 不,没有可以使用的特殊属性。 javascriptSerializer 将枚举序列化为它们的数值而不是它们的字符串表示。您需要使用自定义序列化将枚举序列化为其名称而不是数值。

【讨论】:

不正确,使用 StringEnumConverter。如果您只希望它是单个实例中的字符串,请使用装饰器指定它,或者在序列化程序设置中包含转换器以将枚举全局转换为字符串,反之亦然 @wallacer @DeveloperX 实际上是正确的。 StringEnumConverter 是 Json.Net 属性,在基础 .Net 中不可用 @LukeMarlin 啊,好的。感谢您的澄清!

以上是关于在 JSON (C#) 中序列化枚举值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

指定分配索引值时,JavaScriptSerializer 不使用枚举 [重复]

Newton.JSON将数字序列化为枚举项[重复]

枚举值返回为数字 [重复]

将json字符反序列化为枚举

如果已删除枚举项,则将Json反序列化回列表或枚举会导致错误[重复]