首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用枚举的JsonConvert.SerializeObject无法正确检索EnumMember属性值

问题描述: 使用枚举的JsonConvert.SerializeObject无法正确检索EnumMember属性值。

解答: JsonConvert.SerializeObject是Newtonsoft.Json库中的一个方法,用于将对象序列化为JSON字符串。在序列化枚举类型时,JsonConvert.SerializeObject默认会将枚举值转换为其对应的整数值。如果希望在序列化时使用枚举的EnumMember属性值,需要进行额外的配置。

解决该问题的方法是通过自定义JsonConverter来实现对枚举的序列化。以下是一个示例代码:

代码语言:txt
复制
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Runtime.Serialization;

namespace EnumSerializationExample
{
    // 定义一个枚举类型
    public enum MyEnum
    {
        [EnumMember(Value = "Value1")]
        EnumValue1,

        [EnumMember(Value = "Value2")]
        EnumValue2
    }

    // 自定义JsonConverter
    public class EnumConverter : StringEnumConverter
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return base.ReadJson(reader, objectType, existingValue, serializer);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var enumValue = (Enum)value;
            var enumMemberAttribute = enumValue.GetType().GetField(enumValue.ToString())
                .GetCustomAttributes(typeof(EnumMemberAttribute), false)
                as EnumMemberAttribute[];

            if (enumMemberAttribute != null && enumMemberAttribute.Length > 0)
            {
                writer.WriteValue(enumMemberAttribute[0].Value);
            }
            else
            {
                base.WriteJson(writer, value, serializer);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var myEnum = MyEnum.EnumValue1;

            // 序列化时使用自定义的EnumConverter
            var json = JsonConvert.SerializeObject(myEnum, new EnumConverter());

            Console.WriteLine(json);
            // 输出:"Value1"
        }
    }
}

在上述示例代码中,我们定义了一个枚举类型MyEnum,并为其枚举值添加了EnumMember属性。然后,我们自定义了一个EnumConverter,继承自StringEnumConverter,并重写了WriteJson方法。在WriteJson方法中,我们通过反射获取枚举值的EnumMember属性值,并将其作为序列化结果。

使用该自定义的EnumConverter进行序列化时,可以正确检索EnumMember属性值。在上述示例中,输出的JSON字符串为"Value1",而不是默认的整数值。

推荐的腾讯云相关产品:腾讯云云服务器(CVM) 腾讯云云服务器(CVM)是一种可随时扩展的云计算服务,提供了高性能、可靠稳定的云服务器实例。您可以根据业务需求选择不同配置的云服务器,并根据实际使用情况进行弹性调整。腾讯云云服务器支持多种操作系统和应用场景,适用于网站托管、应用程序部署、数据存储、游戏服务等各种场景。

了解更多关于腾讯云云服务器的信息,请访问:腾讯云云服务器产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Newtonsoft.Json高级用法

8.枚举自定义格式化问题   9.自定义类型转换   10.全局序列化设置  一.忽略某些属性   类似本问开头介绍接口优化,实体中有些属性不需要序列化返回,可以使用该特性。...二.默认处理     序列化时想忽略默认属性可以通过JsonSerializerSettings.DefaultValueHandling来确定,该枚举 DefaultValueHandling.Ignore...通过JsonProperty属性设置方法,可以实现某一属性特别处理需求,如默认处理,空处理,自定义属性名处理,格式化处理。...(p, Formatting.Indented, jsetting)); 八.枚举自定义格式化问题 默认情况下对于实体里面的枚举类型系统是格式化成改枚举对应整型数值,那如果需要格式化成枚举对应字符怎么处理呢...,在Type属性上加上了JsonConverter(typeof(StringEnumConverter))表示将枚举转换成对应字符串,而StringEnumConverter是Newtonsoft.Json

3K100

Newtonsoft.Json

, 下面讲一下一些特殊设置,比如,转换时过滤掉个别属性、重命名字段名称、枚举字段处理、私有变量转换等; 序列化时忽略特定属性字段 需求分析:数据交互时有时候不需要全部属性内容,如只需要PeopleInfo...如下图: image.png 序列化时忽略空属性字段 分析:上上面的例子中,Name字段为Null,假如实际前后端数据交互中,Null数据返回岂不是很没有意义?...image.png 【NullValueHandling:这是每个枚举,Ignore忽略空,Include包含空】 方式2:通过上面的示例,我们可以发现,可以对单个属性进行设置,如果一个实体类有20...: image.png 序列化时枚举处理 分析:在上面的例子中,所转换Gender都是int类型,假如,我们在转换Json时需要转换成对应字符怎么操作?...方法来有条件地序列化属性,要有条件地序列化属性,需要在对象类中增加一个与该属性同名布尔方法,然后使用ShouldSerialize作为方法名称前缀,比如你要设置属性字段Name根据条件来动态决定是否序列化

2.4K80

win10 uwp json

,基本上很多人会容易就打错,当然,可以先实例一个RootObject,然后使用新关键字,name去得到实例属性名称当然在我们使用Json会遇到一些属性我们不要,那么如何json忽略属性,其实很简单,在...所以 StorageFile 等就是无法反序列化,需要使用这篇文章方法保存用户选择文件。...(foo); 结果是 [0,2] 如果对上面的进行反序列会出现和原先一样结果 但是如果尝试使用其他枚举,不会出现错误,枚举数量比原先多一般就不会出现 var...结果还是一样 如果是数值,容易出现这个错误那么如何使用枚举字符串?...,如使用 Key 枚举,这个是ms写,不可以在枚举加上,这时可以在属性加上 例如有个属性 List foo = new List()

26210

再谈Newtonsoft.Json高级用法

阅读目录 动态改变属性序列化名称 枚举序列化问题 全局设置 总结 回到顶部 动态改变属性序列化名称 "动态改变属性序列化名称"顾名思义:在不同场景下实体字段序列化后字段名称不同,比如有下面实体A,正常序列化后...(new List(), Formatting.None, PropSettings);  使用了动态改变属性序列化名称方案后,前后台完全解绑了,不管前台使用什么树形控件,后台实体只有一个树形实体...我们要做仅仅是设置一下字段映射关系而已。 回到顶部 枚举序列化问题    默认情况下对于实体里面的枚举类型系统是格式化成改枚举对应整型数值,那如果需要格式化成枚举对应字符怎么处理呢?...,在Type属性上加上了JsonConverter(typeof(StringEnumConverter))表示将枚举转换成对应字符串,而StringEnumConverter是Newtonsoft.Json...回到顶部 全局设置   全局参数设置功能是我最喜欢使用功能,现在做mvc项目,我都会先设定空处理,减少不必要流量损耗。

1.5K80

win10 uwp json

,基本上很多人会容易就打错,当然,可以先实例一个RootObject,然后使用新关键字,name去得到实例属性名称当然在我们使用Json会遇到一些属性我们不要,那么如何json忽略属性,其实很简单,在...所以 StorageFile 等就是无法反序列化,需要使用这篇文章方法保存用户选择文件。...(foo); 结果是 [0,2] 如果对上面的进行反序列会出现和原先一样结果 但是如果尝试使用其他枚举,不会出现错误,枚举数量比原先多一般就不会出现 var...如果是数值,容易出现这个错误那么如何使用枚举字符串?...,如使用 Key 枚举,这个是ms写,不可以在枚举加上,这时可以在属性加上 例如有个属性 List foo = new List()

56410

CA1027:用 FlagsAttribute 标记枚举

项 “” RuleId CA1027 类别 设计 修复是中断修复还是非中断修复 非中断 原因 枚举是两个幂或枚举中定义其他组合,且不存在 System.FlagsAttribute 属性...如果使用包含 FlagsAttribute 枚举对每个资源可用性进行编码,则可以表示天数任意组合。 如果没有该属性,则只能表示一周中某一天。...对于存储可组合枚举字段,可将单个枚举视为字段中位组。 因此,有时称此类字段为“位字段”。 若要组合枚举,以存储在位字段中,请使用布尔条件运算符。...若要测试位字段,以确定是否存在特定枚举,请使用布尔逻辑运算符。 若要正确存储位字段并检索组合枚举,那么枚举中定义每个必须是两个幂。...若非如此,布尔逻辑运算符将无法提取存储在字段中各个枚举。 如何解决冲突 若要解决此规则冲突,请向枚举添加 FlagsAttribute。

57230

分布式中Redis实现Session终结篇

GetItemExclusive 方法 从会话数据存储区中检索会话和信息,并在请求持续期间锁定数据存储区中会话项数据。...如果被请求会话存储项 actionFlags 参数值等于InitializeItem 枚举 (1),则 GetItemExclusive 方法在设置 actionFlags out 参数之后应将数据存储区中设置为零...否则,数据存储区中现有项使用提供进行更新,并释放对数据任何锁定。请注意,只有与提供 SessionID 和锁定标识符匹配的当前应用程序会话数据才会更新。...会话状态存储区中未初始化项应包含一个与 InitializeItem 枚举 (1) 相等actionFlags 。...使用 GetSessionStaticObjects 方法可以检索 ASP.NET 应用程序 HttpStaticObjectsCollection 实例。

1K80

设计规则

但是,如果存在两个以上类型参数,则大多数用户都会感到过于困难。 CA1008:枚举应具有零 像其他类型一样,未初始化枚举默认为零。...无标志特性枚举应通过使用来定义成员,这样默认即为该枚举有效。 如果应用了 FlagsAttribute 特性枚举定义为零成员,则该成员名称应为“None”,以指示枚举中尚未设置。...对于每一个强制变量,特性还必须提供一个相应只读属性,以便可以在执行时检索该变量。 特性还可以定义可选实参,可选实参也称为命名实参。...另外,out 和 ref 参数之间差异没有得到广泛了解。 CA1024:在适用处使用属性 公共或受保护方法名称以“Get”开头,没有采用任何参数或返回不是数组。 该方法可能很适于成为属性。...应仅限于在设计时无法指定特定整型或字符串类型情况下使用 Object 类型。 CA1044:属性不应是只写 虽然可以接受且经常需要使用只读属性,但设计准则禁止使用只写属性

2K20

100亿数据1万属性数据架构设计

一、背景描述及业务介绍 问:什么是数据库扩展version + ext方案? 使用ext来承载不同业务需求个性化属性使用version来标识ext里各个字段含义。 ?...(1)ext里字段无法建立索引 (2)ext里key有大量冗余,建议key短一些 问:什么是58同城最核心数据?...除此之外,如果ext里某个keyvalue不是正则校验,而是枚举时,需要有一个对进行限定枚举表来进行校验: ?...这个枚举校验,说明key=4属性(对应属性表里二手,手机类型字段),其不只是要进行“short类型”校验,而是value必须是固定枚举。...(1)品类层级关系,对应电商里类别层级体系 (2)属性扩展,对应电商里各类别商品SKU属性 (3)枚举校验,对应属性枚举,例如颜色:红,黄,蓝 解决了key压缩,key描述,key扩展,value

2K60

一起来啃《JavaScript语言精粹》----对象

二、对象检索 1.[]后缀中括住一个字符串表达式。 2.如果字符串表达式是一个字符串字面量,而且它是一个合法标识符且不是保留字,那么也可以用 . 表示法代替。我们优先使用 ....obj['name-child'] obj.user.name 如果你尝试检索一个不存在成员属性,将返回undefined。...Paste_Image.png 五、枚举 for in 语句可用来遍历一个对象中所有属性名。该枚举过程将会列出所有的属性--包括函数和你可能不关心原型中属性--所以有必要过滤掉那些你不想要。...Paste_Image.png 属性名出现顺序是不确定,如果你想要确保属性以特定顺序出现,最好办法就是完全避免使用 for in 语句,而是创建一个数组,在其中以正确顺序包含属性名: ?...Paste_Image.png 通过使用 for 而不是 for in ,可以得到我们想要属性,而且不用担心可能发掘出原型链中属性,并且我们按正确顺序取得了它们

74860

C#实战:使用ExcelKit实现海量数据导出

使用者可以根据接口实现自己Converter。...("用户类型")],导出时就会根据指定描述展示对应文字,如果枚举加了可空,则使用时Converter = typeof(EnumConverter<UserStatusEnum?...DataStartRow(默认从1开始)和DataEndRow(可空不传则读完)代表读取数据条数位置,不配置采用默认 ● ReadRowsOptions仅仅是读取行数据,数据返回是一行,没有对应...Key,默认情况下,空单元格会被直接忽略,返回行数据都是有,当需要返回包含空单元格时,配置ReadEmptyCell为true,同时指定Excel列信息ColumnHeaders数组,里面的元素为...,false没有使用 } }}四、总结ExcelKit支持百万级数据导出,占用内存较小,使用也比较方便,有需要朋友可以试一下!

60470

Unity 数据读取|(四)Json文件解析(Newtonsoft.Json ,Litjson,JsonUtility,SimpleJSON)

它们以键值对形式存储数据,其中键是字符串,可以是字符串、数字、布尔、数组、对象或null。 JSON文件通常具有.json扩展名,例如example.json。...无法存储函数或类:JSON只能存储数据,无法存储函数或类等复杂数据结构,这限制了JSON使用范围。 3....这意味着如果您 C# 对象包含自定义属性,LitJson 可能无法正确地序列化这些属性。 JSON字符串中key也需要和类字段名字完全一致,如果不对应的话会解析失败。...这意味着如果您 C# 对象包含自定义属性,JsonUtility 可能无法正确地序列化这些属性。...缺点: 不支持复杂JSON格式:SimpleJSON只支持简单JSON格式,对于一些复杂JSON格式可能会无法正确解析。

1K21

后端表单验证JSR303

,我们需要引入依赖,一般来说我们只需要引入 javax.validation即可,但是对于一些 javax.validation无法验证(例如URL)我们就需要引入 hibernate来进行验证了。...JSR注释: @NotNull –验证带注释属性不为 null @AssertTrue –验证带注释属性为 true @Size –验证带注释属性大小介于属性 min和 max之间;可以应用于...String, Collection, Map和数组属性 @Min – v验证带注释属性不小于 value属性 @Max –验证带注释属性不大于 value属性 @Email –验证带注释属性是有效电子邮件地址...这是通常在相应属性未通过验证时呈现消息。...@Valid:首先使用 @Valid 为验证级联标记属性、方法参数或方法返回类型。也就是说我们使用这个注解后验证才生效。

94230

Entity Framework Core 捕获数据库变动

这个功能虽然强大但是某些时候我们使用数据库并不是 SQL Server 数据库,或者某些情况下我们不适合使用 SQL Server 数据库所提供这个功能。那么这个时候该怎么办呢?...那么我们先来看两个问题: 审计数据是在什么时候产生并写入数据库呢? 数据新旧是如何获取到呢?...零、创建审计模型 捕获审计数据并存入数据库第一步是创建审计模型,只有具有了审计模型审计数据才能正确存入数据库。...,这里需要注意一点是部分实体属性是由数据库生成,例如当前日期、Id等,这些需要等待 SaveChanges 方法执行完毕后方可获得,也就是说在这种情况下保存审计数据必须在 SaveChanges...属性来获取旧和新并保存。

57610

Spring认证中国教育管理中心-Spring Data R2DBC框架教程六

属性覆盖在某种程度上会产生冲突,因为属性共享相同名称但可能代表两个不同。我们通常建议使用不同属性名称。 Spring Data 模块通常支持包含不同覆盖属性。...瞬态属性不能在持久性构造函数中使用,因为转换器无法实现构造函数参数。...@PersistenceConstructor: 标记给定构造函数——即使是受包保护构造函数——在从数据库实例化对象时使用。构造函数参数按名称映射到检索行中。...某些数据库(例如Postgres)可以使用其特定于数据库枚举列类型本机写入枚举。...Spring DataEnum默认将String转换为最大可移植性。要保留实际枚举,请注册一个@Writing转换器,其源和目标类型使用实际枚举类型以避免使用Enum.name()转换。

2.1K20

在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式

而CQRS模式则通过将读操作和写操作分离,优化了系统性能和可维护性。本文小编将为大家介绍如何在ASP.NET Core微服务架构下使用RabbitMQ来实现CQRS模式。...小编将会使用RabbitMQ来处理命令(放置订单)和事件(订单处理)。这个系统将会用队列来分离命令和事件,同时遵循CQRS原则。 设计注意事项: OrderCommand:表示下订单命令。...(具体可以参考前面的ConsumeOrderCommands代码) // 异步处理接收到查询并检索订单数据 } } 在微服务中定义命令和查询模型 命令和查询模型 // 命令模型...public class OrderQuery { public string QueryId { get; set; } // 其他与订单相关字段(省略) } 使用RabbitMQ编写订单命令和订单查询...这种组合能够实现异步通信和事件驱动架构,通过将命令发送到命令处理器执行写操作,同时使用订阅模式将事件发布给查询服务,实现实时数据查询和更新。

23510

ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构

主要集中增删该查每个模块都有,所以本次是为封装相同接口方法    如果你想了解怎么重构普通接口DAL层请查看第二节点    如果你只想了解利用T4链接EF生成代码,可以忽略前两节,之后跳后最后T4模版使用...所有部分都必须使用 partial 关键字。在编译时,各个部分都必须可用来形成最终类型。各个部分必须具有相同可访问性,如 public、private 等。...指定基类所有部分必须一致,但忽略基类部分仍继承该基类型。各个部分可以指定不同基接口,最终类型将实现所有分部声明所列出全部接口。在某一分部定义中声明任何类、结构或接口成员可供所有其他部分使用。...因为ObjectContext有些方法和属性在DBContext已经不能用了 ObjectContext和ObjectSet都提供了AddObject功能:   比如 context.AddObject...------- // // 此代码由T4模板自动生成 // 生成时间 2013-04-22 10:41:47 by App // 对此文件更改可能会导致不正确行为

1.9K60
领券