c# - 将枚举值和名称序列化为 JSON
问题描述
这个问题是相关的,但恕我直言,与
在测试时,我还偶然发现了这个让我的生活变得困难的罪魁祸首 LinqPad: 为什么 LINQPad 将枚举整数值转储为字符串?
现在,我的实际问题是:我的应用程序(特别是 SyncFusion 组件数据源,例如 MultiSelect)需要 JSON 格式的枚举,例如:
[ {"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"} ]
更新
正如 dbc 指出的那样,我的问题可能还不够清楚。我不想序列化枚举的一个条目,而是整个结构。然后 JSON 可以用于 Javascript 中的数据源,例如,简化:
<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 等)并没有产生数组中的所有选项,所以我最终使用了 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(从 GAC 导入 Newtonsoft.Json):
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
};
解决方案
这是 Microsoft Docs 中将 Enum 转换为 Dictionary 的示例
然后您可以将字典序列化为 JSON。
推荐阅读
- mysql - mySql SELECT GROUP_CONCAT 查询不返回长文本单元格中的所有数据
- java - JPA EntityManger 事务提交错误
- javascript - Core-js,如何仅包含所需的 polyfill
- lua - 无法让 PlayerSay 在 Gmod lua 插件中工作
- security - 如何处理用户输入文件(图像/视频)?
- odoo - Paypal在ODOO 12中从报价到销售订单
- python - 如何修复多处理方法的重复输出?
- python - Django:找不到模板/index.html
- jquery - 如何减去/排除两个 jQuery 查询?
- sql - 从子查询中选择时是否有任何性能差异?