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

如何用JsonConvert.DeserializeObject反序列化含多类型Data的JSON对象?

处理多类型Data字段的JSON反序列化问题

方法一:泛型DTO重构

将原有的ReadUseCaseLogDto改为泛型类,通过指定泛型参数匹配Data字段的实际类型,实现类型安全的反序列化:

public class ReadUseCaseLogDto<TData>
{
    // 保留其他原有字段
    public TData Data { get; set; }
}

使用时根据JSON中Data的具体类型选择对应泛型:

  • 当Data是含DateFrom的对象时:
    var log = JsonConvert.DeserializeObject<ReadUseCaseLogDto<Dictionary<string, string>>>(jsonContent);
    
  • 当Data是整数时:
    var log = JsonConvert.DeserializeObject<ReadUseCaseLogDto<int>>(jsonContent);
    

方法二:自定义JSON转换器

如果无法修改基础类结构,或需要自动适配Data的多种类型,可编写自定义JsonConverter来处理类型转换逻辑:

public class FlexibleDataConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(object);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.TokenType switch
        {
            JsonToken.StartObject => serializer.Deserialize<Dictionary<string, string>>(reader),
            JsonToken.Integer => reader.Value.ToString(), // 或直接返回(int)reader.Value,按需选择
            JsonToken.String => reader.Value,
            // 可扩展支持更多类型,比如布尔值、数组等
            _ => reader.Value
        };
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

在ReadUseCaseLogDto的Data字段上标记该转换器:

public class ReadUseCaseLogDto
{
    // 其他字段
    [JsonConverter(typeof(FlexibleDataConverter))]
    public object Data { get; set; }
}

反序列化后可通过类型判断处理不同情况:

var log = JsonConvert.DeserializeObject<ReadUseCaseLogDto>(jsonContent);
if (log.Data is Dictionary<string, string> dataDict)
{
    string dateFrom = dataDict["DateFrom"];
    // 处理对象类型逻辑
}
else if (log.Data is string intStr && int.TryParse(intStr, out int intValue))
{
    // 处理整数类型逻辑
}

方法三:动态类型临时处理

若追求快速实现且不介意类型安全,可使用JObject动态处理:

var logObj = JsonConvert.DeserializeObject<JObject>(jsonContent);
var data = logObj["Data"];

if (data.Type == JTokenType.Object)
{
    var dataDict = data.ToObject<Dictionary<string, string>>();
    // 处理对象逻辑
}
else if (data.Type == JTokenType.Integer)
{
    int intValue = data.Value<int>();
    // 处理整数逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:25:16