如何将扁平化路径字典转换为嵌套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
相关产品推荐
相关产品推荐

