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

如何将System.Text.Json反序列化的JsonElement转为实际类型?

解决System.Text.Json反序列化object类型为实际CLR类型的问题

当使用System.Text.Json反序列化object类型属性时,默认会得到JsonElement而非实际的CLR类型(如string、int),可以通过以下两种方法解决:

方法一:自定义JsonConverter转换器

编写一个自定义转换器,根据JSON的Token类型将其转换为对应的CLR类型:

public class ObjectToActualTypeConverter : JsonConverter<object>
{
    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.TokenType switch
        {
            JsonTokenType.String => reader.GetString(),
            JsonTokenType.Number when reader.TryGetInt32(out int intVal) => intVal,
            JsonTokenType.Number when reader.TryGetInt64(out long longVal) => longVal,
            JsonTokenType.Number when reader.TryGetDouble(out double doubleVal) => doubleVal,
            JsonTokenType.True => true,
            JsonTokenType.False => false,
            JsonTokenType.Null => null,
            JsonTokenType.StartObject => JsonSerializer.Deserialize<Dictionary<string, object>>(ref reader, options),
            JsonTokenType.StartArray => JsonSerializer.Deserialize<List<object>>(ref reader, options),
            _ => JsonDocument.ParseValue(ref reader).RootElement.Clone()
        };
    }

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        JsonSerializer.Serialize(writer, value, value.GetType(), options);
    }
}

使用方式

在反序列化时,将转换器添加到JsonSerializerOptions中:

var options = new JsonSerializerOptions
{
    Converters = { new ObjectToActualTypeConverter() },
    // 可选:忽略大小写匹配属性名
    PropertyNameCaseInsensitive = true
};

var myObject = await JsonSerializer.DeserializeAsync<MyObject>(stream, options);

这样SomeObject会被自动转换为对应的实际类型:

  • JSON字符串"MyString" → string类型值
  • JSON数字123 → int类型值(如果数字超出int范围会自动转成long或double)
  • JSON布尔值true/false → bool类型值
  • JSON对象/数组 → Dictionary<string, object>或List<object>

方法二:使用JsonNode(.NET 6及以上)

如果你的项目基于.NET 6+,可以将SomeObject的类型改为JsonNode,之后通过GetValue<T>()方法获取实际类型:

修改实体类

public class MyObject
{
    public string Name { get; set; }
    public JsonNode SomeObject { get; set; }
}

获取实际值

var myObject = await JsonSerializer.DeserializeAsync<MyObject>(stream);

// 获取字符串
var strValue = myObject.SomeObject.GetValue<string>();
// 获取整数
var intValue = myObject.SomeObject.GetValue<int>();

这种方式更灵活,适合需要动态处理不同类型的场景,但需要显式指定要转换的类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:33:36