反序列化至枚举时ArgumentException错误:值‘connected’未找到
解决Swagger生成代码反序列化枚举时的ArgumentException问题
这个问题我之前也碰到过,核心原因就是枚举的字符串值和反序列化器的预期不匹配,结合你给出的错误信息和JSON示例,咱们一步步排查解决:
1. 先确认Swagger定义与生成的枚举代码是否匹配
首先检查你的Swagger规范文件(YAML/JSON)里connectedStatus对应的枚举定义,是不是明确包含了connected这个字符串值?
如果Swagger里的枚举是这样写的:
components: schemas: YourProfileModel: properties: connectedStatus: type: string enum: - connected - disconnected
那生成的代码应该会自动给枚举成员加上EnumMember特性,类似这样:
public enum ConnectedStatus { [EnumMember(Value = "connected")] Connected, [EnumMember(Value = "disconnected")] Disconnected }
如果Swagger里的枚举值是首字母大写的Connected,那生成的枚举就不会有这个特性,反序列化小写的connected自然会报错。
2. 配置反序列化器支持大小写不敏感或驼峰映射
如果你的枚举代码已经是正确的,但反序列化器默认严格匹配大小写,可以通过配置解决:
如果你用的是Newtonsoft.Json(Json.NET)
在序列化/反序列化的配置里添加StringEnumConverter,并设置大小写不敏感或驼峰匹配:
var jsonSettings = new JsonSerializerSettings(); // 方案1:直接支持驼峰命名的字符串匹配 jsonSettings.Converters.Add(new StringEnumConverter { CamelCaseText = true }); // 方案2:完全忽略大小写匹配 jsonSettings.Converters.Add(new StringEnumConverter { CaseSensitive = false });
如果你用的是System.Text.Json
修改序列化配置:
var jsonOptions = new JsonSerializerOptions { // 支持驼峰命名的枚举字符串 Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) }, // 同时开启属性名大小写不敏感(可选) PropertyNameCaseInsensitive = true };
3. 临时修复:手动补全EnumMember特性
如果暂时无法修改Swagger定义,可以直接修改生成的枚举代码,给对应的成员加上EnumMember特性:
using System.Runtime.Serialization; public enum ConnectedStatus { [EnumMember(Value = "connected")] Connected, // 其他枚举成员同理 [EnumMember(Value = "disconnected")] Disconnected }
这样反序列化器就能正确识别JSON里的connected字符串了。
验证测试
修改后可以用你的示例JSON再测试一次:
{ "profileDescription" : "profileDescription", "videoURL" : "http://example.com/aeiou", "imageURL" : "http://example.com/aeiou", "imageURLs" : [ "http://example.com/aeiou", "http://example.com/aeiou" ], "name" : "name", "connectedStatus" : "connected", "id" : "046b..." }
应该就能正常反序列化,不会再抛出Requested value 'connected' was not found的错误了。
内容的提问来源于stack exchange,提问作者TomSelleck
相关产品推荐
相关产品推荐

