C#中如何正确反序列化嵌套字典为Dictionary<string, object>?
解决嵌套字典JSON反序列化问题
当你把嵌套字典序列化为JSON后,直接反序列化为Dictionary<string, object>时,嵌套的子对象会被Json.NET解析为JObject类型,而非Dictionary<string, object>,导致无法直接强转。可以通过以下两种方式解决:
方法一:自定义JSON转换器
创建一个自定义转换器,让Json.NET自动将嵌套的JSON对象解析为Dictionary<string, object>:
public class DictionaryConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(Dictionary<string, object>); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartObject) { var jObject = JObject.Load(reader); var dictionary = new Dictionary<string, object>(); foreach (var pair in jObject) { var value = pair.Value.Type switch { JTokenType.Object => ReadJson(pair.Value.CreateReader(), typeof(Dictionary<string, object>), null, serializer), JTokenType.Array => pair.Value.ToObject<List<object>>(serializer), _ => pair.Value.ToObject<object>(serializer) }; dictionary.Add(pair.Key, value); } return dictionary; } return serializer.Deserialize(reader, objectType); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
使用时在反序列化时传入该转换器:
var settings = new JsonSerializerSettings { Converters = { new DictionaryConverter() } }; var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(json, settings);
这样嵌套的子对象会直接被解析为Dictionary<string, object>,可直接进行类型转换。
方法二:递归转换JObject为Dictionary
如果不想编写自定义转换器,可在反序列化后手动递归遍历结果,将JObject转为Dictionary<string, object>、JArray转为List<object>:
public static Dictionary<string, object> JObjectToDictionary(JObject jObject) { var dictionary = new Dictionary<string, object>(); foreach (var pair in jObject) { dictionary.Add(pair.Key, TokenToObject(pair.Value)); } return dictionary; } public static object TokenToObject(JToken token) { return token.Type switch { JTokenType.Object => JObjectToDictionary((JObject)token), JTokenType.Array => token.Select(TokenToObject).ToList(), _ => token.ToObject<object>() }; }
使用方式:
var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); // 遍历并转换嵌套对象 foreach (var key in values.Keys.ToList()) { if (values[key] is JObject jObj) { values[key] = JObjectToDictionary(jObj); } else if (values[key] is JArray jArr) { values[key] = jArr.Select(TokenToObject).ToList(); } }
执行后所有嵌套对象都会被转换为Dictionary<string, object>类型。
内容的提问来源于stack exchange,提问作者hesam gol
相关产品推荐
相关产品推荐

