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

如何将扁平化路径字典转换为嵌套C#对象或JSON对象?

从扁平化路径字典构建嵌套JSON对象(C#)

给定一个键为层级路径(用/分隔)、值为对应属性值的Dictionary<string, object>,我们可以通过逐层构建嵌套对象的方式还原出目标JSON结构。下面提供两种主流JSON库的实现方案:

方案1:使用Newtonsoft.Json(Json.NET)

这是.NET生态中广泛使用的第三方JSON库,兼容性好,处理复杂JSON更灵活。

using Newtonsoft.Json.Linq;
using System.Collections.Generic;

public static JObject UnflattenDictionary(Dictionary<string, object> flatDict)
{
    var root = new JObject();
    
    foreach (var kvp in flatDict)
    {
        // 拆分路径为层级节点
        var pathParts = kvp.Key.Split('/');
        var currentNode = root;
        
        // 遍历路径的前n-1个节点,创建嵌套对象
        for (int i = 0; i < pathParts.Length - 1; i++)
        {
            var nodeName = pathParts[i];
            // 如果当前节点不存在或不是对象类型,创建新的JObject
            if (!currentNode.TryGetValue(nodeName, out var existingNode) || existingNode.Type != JTokenType.Object)
            {
                var newObj = new JObject();
                currentNode[nodeName] = newObj;
                currentNode = newObj;
            }
            else
            {
                currentNode = (JObject)existingNode;
            }
        }
        
        // 给最后一个节点赋值
        currentNode[pathParts[^1]] = JToken.FromObject(kvp.Value);
    }
    
    return root;
}

使用示例

var flatObjDict = new Dictionary<string, object>
{
    { "name", "test" },
    { "father/name", "Mike" },
    { "father/age", 70 },
    { "father/dog/color", "Red" }
};

var nestedObj = UnflattenDictionary(flatObjDict);
// 转换为格式化的JSON字符串
string jsonResult = nestedObj.ToString(Newtonsoft.Json.Formatting.Indented);

方案2:使用System.Text.Json(.NET 6+)

这是.NET官方内置的JSON库,无需额外安装依赖,适合.NET 6及以上版本的项目。

using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Nodes;

public static JsonNode UnflattenDictionaryToJsonNode(Dictionary<string, object> flatDict)
{
    var root = new JsonObject();
    
    foreach (var kvp in flatDict)
    {
        var pathParts = kvp.Key.Split('/');
        JsonNode currentNode = root;
        
        for (int i = 0; i < pathParts.Length - 1; i++)
        {
            var nodeName = pathParts[i];
            if (!currentNode.AsObject().TryGetValue(nodeName, out var childNode) || childNode is not JsonObject)
            {
                var newObj = new JsonObject();
                currentNode.AsObject()[nodeName] = newObj;
                currentNode = newObj;
            }
            else
            {
                currentNode = childNode;
            }
        }
        
        // 赋值并自动处理类型转换
        currentNode.AsObject()[pathParts[^1]] = JsonValue.Create(kvp.Value);
    }
    
    return root;
}

使用示例

var flatObjDict = new Dictionary<string, object>
{
    { "name", "test" },
    { "father/name", "Mike" },
    { "father/age", 70 },
    { "father/dog/color", "Red" }
};

var nestedNode = UnflattenDictionaryToJsonNode(flatObjDict);
// 转换为格式化的JSON字符串
string jsonResult = nestedNode.ToJsonString(new JsonSerializerOptions { WriteIndented = true });

注意事项

  • 如果存在路径冲突(比如同时定义了father和father/name),后处理的键会覆盖先处理的,若需避免冲突可在函数中添加冲突检查逻辑
  • 支持任意深度的层级路径,无论/分隔符的数量多少
  • 基础数据类型(字符串、数字、布尔值等)会自动完成类型转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:00:24