如何用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
相关产品推荐
相关产品推荐

