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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:50:23