.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基础类型:
- 自定义转换器:
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); } }
- 在Program.cs中配置序列化选项:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new ObjectConverter()); });
配置完成后,客户端传入的数值会直接绑定为int类型,此时var v = (int)_input.value;即可正常执行。
内容的提问来源于stack exchange,提问作者Orgil
相关产品推荐
相关产品推荐

