客户端反序列化JSON遇JsonException:强类型ID适配故障
解决NSwag强类型ID反序列化JsonException的方案
以下是几个可行的解决思路,按需选择:
自定义JSON转换器
给你的强类型ID(比如AppRoleId这类值对象)写个自定义JsonConverter,手动管控序列化和反序列化逻辑。
示例代码(C#):public class AppRoleIdConverter : JsonConverter<AppRoleId> { public override AppRoleId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var idStr = reader.GetString(); return idStr != null ? new AppRoleId(Guid.Parse(idStr)) : default; } public override void Write(Utf8JsonWriter writer, AppRoleId value, JsonSerializerOptions options) { writer.WriteStringValue(value.Value.ToString()); } }之后要么给NSwag生成的强类型ID字段加
[JsonConverter(typeof(AppRoleIdConverter))]特性,要么在JsonSerializerOptions里全局注册这个转换器。调整NSwag生成配置
修改NSwag的配置文件(比如nswag.json),把强类型ID映射成字符串或Guid类型,避免生成不好处理的自定义类型。
配置示例:"typeMappings": [ { "from": "AppRoleId", "to": "Guid", "typeName": "AppRoleId", "isDictionary": false } ]重新生成客户端代码后,API返回的字符串ID会直接映射成Guid,不会再出转换异常。
手动处理反序列化流程
先把JSON字符串反序列成JObject或动态对象,提取appPermissionsSaved数组后,手动把强类型ID字段转成对应类型,再映射到AppPermissionsSaved。
示例代码:var jsonContent = await httpClient.GetStringAsync("your-api-url"); var rootObj = JObject.Parse(jsonContent); var permissionsJArray = rootObj["appPermissionsSaved"] as JArray; var savedPermissionsList = new List<AppPermissionsSaved>(); foreach (var item in permissionsJArray) { savedPermissionsList.Add(new AppPermissionsSaved { AppRoleId = new AppRoleId(Guid.Parse(item["appRoleId"].ToString())), // 其他字段逐一赋值 }); }替换NSwag的序列化器
把NSwag生成客户端时用的默认序列化器换成Newtonsoft.Json,它对自定义类型的支持更灵活。
生成命令示例:nswag openapi2csclient /input:swagger.json /output:ApiClient.cs /serializer:NewtonsoftJson之后给强类型ID加Newtonsoft.Json的
[JsonConverter]特性,或者全局配置转换器即可。
内容的提问来源于stack exchange,提问作者Mike Mastro
相关产品推荐
相关产品推荐

