【发布时间】:2019-01-13 00:43:06
【问题描述】:
这个问题是相关的,但恕我直言,与
在测试时,我还偶然发现了这个让我的生活变得困难的罪魁祸首 LinqPad: Why does LINQPad dump enum integer values as strings?
现在,我的实际问题: 我的应用程序(特别是 SyncFusion 组件数据源,例如 MultiSelect)需要 JSON 格式的枚举,例如像这样:
[ {"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"} ]
更新
正如 dbc 指出的那样,我的问题可能还不够清楚。我不想序列化枚举的一个条目,而是整个结构。 JSON 然后可以用于 Javascript 中的数据源,例如对于 a ,简化:
<option value=0>Unknown</option>
<option value=1>Open</option> etc
JSON 对象与命名空间中的 Enum 相同(除了我为每个条目的 Key 和 Value 赋予了属性名称:
public enum ListOptions
{
Unknown = 0,
Open = 1,
Closed = 2,
Approve = 3
}
我一直在努力使用枚举,所有其他方法(例如指定 Json StringConverter 等)都没有在数组中产生 all 选项,所以我最终使用了 Linq。我的视图模型现在有一个这样的字符串属性:
public string CrewListOption => JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions))
.Cast<int>()
.Select(e => new { Id = (int) e, Name = typeof(ListOptions).GetEnumName(e) }));
鉴于我几乎是 ASP.Net Core 的初学者,我很难相信这应该是一个好的解决方案。然而,我发现很难找到同一件事的直接更好的例子。
如果您能帮助我改进这一点,我将不胜感激,并使其在将整个枚举“导出”到 JSON 时可能更普遍有用。
这是完整的 LinqPad(Newtonsoft.Json 是从 GAC 导入的):
void Main()
{
Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = e, Name = (ListOptions) e } ).Dump(); // these are identical, except for the typeof()
Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int) e, Name = typeof(ListOptions).GetEnumName(e) }).Dump(); // is typeof(MyEnumType) better?
string JsonString = JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int) e, Name = typeof(ListOptions).GetEnumName(e) }));
JsonString.Dump(); // [{"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"}]
}
public enum ListOptions {
Unknown = 0,
Open = 1,
Closed = 2,
Approve = 3
};
【问题讨论】:
-
我不确定我是否理解您的问题。既然您使用的是json.net,那么使用
StringEnumConverter就足够了,如this answer 到.NET - JSON serialization of enum as string 所示?如果没有,您能否包含一个minimal reproducible example,显示您要序列化的数据模型和所需的 JSON? -
嗨@dbc,我希望我做到了;
StringEnumConverter只会转换一个条目,而不是整个枚举。我会重新审视我的问题并尝试改进它。