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

.NET 6 WebAPI中如何将JsonElement转换为Int等原始类型?

.NET 6 WebAPI中JsonElement转其他类型的解决方法

问题原因

.NET 6默认使用System.Text.Json序列化器,当JSON中的基础类型(如数字、字符串)绑定到object类型的属性时,会被包装为JsonElement对象,而非直接转为对应的CLR类型,因此直接强转会抛出类型转换错误。

解决方法

方法1:直接从JsonElement转换

先判断value的实际类型为JsonElement,再利用其内置方法完成转换:

// 安全转换(推荐,避免类型不匹配报错)
if (_input.value is JsonElement element && element.TryGetInt32(out int v))
{
    // 在这里使用转换后的int值v
}

// 确定类型时直接转换
var v = ((JsonElement)_input.value).GetInt32();

JsonElement还提供了GetString()、GetBoolean()、GetDouble()等方法,对应不同基础类型的转换需求。

方法2:使用JsonNode替代object

.NET 6引入了JsonNode类型,可更灵活地处理JSON数据,先修改模型类:

using System.Text.Json.Nodes;

public class param_class
{
    public string? name { get; set; }
    public JsonNode? value { get; set; }
}

转换时可直接调用内置方法:

// 直接转换
int v = _input.value.AsValue().GetValue<int>();

// 安全转换
if (_input.value is JsonValue jsonValue && jsonValue.TryGetValue<int>(out int v))
{
    // 使用v
}

方法3:配置序列化器,直接绑定为CLR类型

通过自定义JSON转换器,让object类型的属性直接绑定为对应的CLR基础类型:

  1. 自定义转换器:
public class ObjectConverter : JsonConverter<object>
{
    public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.TokenType switch
        {
            JsonTokenType.Number => reader.TryGetInt32(out int intVal) ? intVal :
                                    reader.TryGetInt64(out long longVal) ? longVal :
                                    reader.GetDouble(),
            JsonTokenType.String => reader.GetString(),
            JsonTokenType.True => true,
            JsonTokenType.False => false,
            JsonTokenType.Null => null,
            _ => JsonSerializer.Deserialize<JsonElement>(ref reader, options)
        };
    }

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        JsonSerializer.Serialize(writer, value, value.GetType(), options);
    }
}
  1. 在Program.cs中配置序列化选项:
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new ObjectConverter());
    });

配置完成后,客户端传入的数值会直接绑定为int类型,此时var v = (int)_input.value;即可正常执行。


内容的提问来源于stack exchange,提问作者Orgil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:45:57