You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

客户端反序列化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:12:33