ASP.NET Core 6请求体反序列化新增ValueKind属性问题求助
解决ASP.NET Core + NSwag反序列化后出现ValueKind属性的问题
这个问题本质是NSwag生成的模型中,空对象对应的类型被设为了JsonElement,而JsonElement自带ValueKind属性(值3代表Object类型),序列化时会把这个属性输出。以下是具体解决思路:
检查并修正NSwag生成的模型类
打开生成的DTO文件,查看SomeProperty的类型:- 如果这个字段在OpenAPI规范中应该对应某个具体的业务类,说明规范定义有问题(比如把类型写成了
object而非具体schema),修正OpenAPI文档后重新生成代码。 - 如果确实需要接收任意空对象,手动把
JsonElement类型改成object,这样序列化时就不会带出ValueKind。
- 如果这个字段在OpenAPI规范中应该对应某个具体的业务类,说明规范定义有问题(比如把类型写成了
调整NSwag生成配置
在NSwag的生成配置里(不管是NSwagStudio可视化工具还是nswag.json配置文件),找到C#代码生成的JSON相关设置:- 关闭
Generate JsonElement for 'object' types选项,让NSwag把OpenAPI中的object类型生成object而非JsonElement。 - 若使用命令行生成,添加参数
--generate-json-element-as-object false。
- 关闭
自定义Json序列化规则(无法修改生成代码时)
如果没法调整生成配置或模型类,可以通过修改ASP.NET Core的序列化选项,忽略JsonElement的ValueKind属性:
使用System.Text.Json的话,添加自定义转换器:builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonElementConverter()); }); public class JsonElementConverter : JsonConverter<JsonElement> { public override JsonElement Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return JsonElement.ParseValue(ref reader); } public override void Write(Utf8JsonWriter writer, JsonElement value, JsonSerializerOptions options) { // 直接写入原始JSON结构,不输出ValueKind value.WriteTo(writer); } }若项目用Newtonsoft.Json,也可以通过自定义转换器实现相同效果,避免序列化
ValueKind。统一序列化配置
确保NSwag生成的客户端和ASP.NET Core控制器使用相同的序列化库(要么都用System.Text.Json,要么都用Newtonsoft.Json),并保持序列化选项一致,避免因序列化规则差异导致的额外属性输出。
内容的提问来源于stack exchange,提问作者Nourelayne Salah eddine
相关产品推荐
相关产品推荐

