C# HTTP请求无法解析至Model类:需兼容数字与字符串参数
兼容数字和字符串格式的C# HTTP POST接口解决方案
当前接口的Json模型中Prop1为string类型,仅能接受字符串格式的请求(场景二),无法处理数字格式的Prop1(场景一),以下是两种兼容处理方案:
方法一:自定义JSON转换器(推荐,精准控制)
通过自定义JsonConverter,让Prop1属性同时支持数字和字符串输入。
1. 实现自定义转换器(System.Text.Json)
using System.Text.Json; using System.Text.Json.Serialization; public class StringNumberConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 处理数字类型输入,转换为字符串 if (reader.TokenType == JsonTokenType.Number) { return reader.GetInt64().ToString(); } // 处理字符串类型输入,直接返回 else if (reader.TokenType == JsonTokenType.String) { return reader.GetString(); } throw new JsonException($"无法解析类型为{reader.TokenType}的输入到字符串属性"); } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(value); } }
2. 为模型属性添加转换器标记
修改Json模型,在Prop1上添加[JsonConverter]特性:
public class Json { [JsonConverter(typeof(StringNumberConverter))] public string Prop1 { get; set; } public string Prop2 { get; set; } }
方法二:全局配置JSON序列化(批量生效)
如果需要多个接口或属性都支持数字与字符串互转,可以全局配置序列化选项:
System.Text.Json 全局配置
在Program.cs中添加以下配置:
builder.Services.AddControllers() .AddJsonOptions(options => { // 允许读取数字为字符串,同时将字符串写入为数字(按需开启) options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString; });
Newtonsoft.Json 全局配置(若项目使用Newtonsoft)
如果项目配置了使用Newtonsoft.Json,可在Program.cs中配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new StringNumberConverter()); });
对应Newtonsoft版本的转换器实现:
using Newtonsoft.Json; public class StringNumberConverter : JsonConverter<string> { public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Integer) { return reader.Value.ToString(); } else if (reader.TokenType == JsonToken.String) { return (string)reader.Value; } throw new JsonException($"无法解析类型为{reader.TokenType}的输入到字符串属性"); } public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { writer.WriteValue(value); } }
验证效果
配置完成后,场景一(Prop1为数字)和场景二(Prop1为字符串)的请求都能正常触发接口,Prop1会被正确转换为字符串类型传入EditRequet方法。
内容的提问来源于stack exchange,提问作者Sahil Man Singh
相关产品推荐
相关产品推荐

