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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:35:51