如何在C#中将点表示法命名空间字符串列表转为嵌套JSON?
Convert Dot-Notation Namespace Strings to Nested JSON String
看起来你已经搞定了大部分逻辑!针对把点分隔的命名空间字符串列表转成嵌套JSON的需求,我给你整理了更通用的实现思路和代码示例,能适配更深层级的嵌套和更多测试场景:
核心实现思路
- 将每个字符串按
.分割成层级节点数组 - 从根对象开始,逐层遍历节点,动态创建嵌套的对象结构
- 当遍历到最后一个节点时,将其添加到父节点对应的数组中(如果父节点还没有数组就新建)
C# 代码示例
using System; using System.Collections.Generic; using System.Dynamic; using System.Text.Json; public class NamespaceToJsonConverter { public static string ConvertToNestedJson(List<string> strings) { var root = new ExpandoObject(); foreach (var str in strings) { var parts = str.Split('.'); dynamic current = root; // 遍历到倒数第二个节点,构建嵌套对象 for (int i = 0; i < parts.Length - 2; i++) { var key = parts[i]; var currentDict = (IDictionary<string, object>)current; if (!currentDict.ContainsKey(key)) { currentDict[key] = new ExpandoObject(); } current = currentDict[key]; } // 处理数组父节点和最后一个元素 var parentKey = parts[parts.Length - 2]; var lastElement = parts[parts.Length - 1]; var parentDict = (IDictionary<string, object>)current; // 初始化数组(如果不存在) if (!parentDict.ContainsKey(parentKey)) { parentDict[parentKey] = new List<string>(); } // 添加元素到数组 ((List<string>)parentDict[parentKey]).Add(lastElement); } // 序列化带缩进的JSON return JsonSerializer.Serialize(root, new JsonSerializerOptions { WriteIndented = true }); } // 测试用例 public static void Main() { var strings = new List<string> { "example.string.1", "example.string.2", "example.anotherstring.1", "demo.layer1.layer2.itemX", "demo.layer1.layer2.itemY" }; var resultJson = ConvertToNestedJson(strings); Console.WriteLine(resultJson); } }
代码说明
- 用
ExpandoObject动态构建嵌套结构,既可以像字典一样灵活操作,又能直接被JSON序列化 - 适配任意深度的层级嵌套(比如
a.b.c.d.123会被转成{"a":{"b":{"c":{"d":["123"]}}}}) - 自动处理同一父节点下的多个子元素,将它们收集到数组中
- 序列化时开启
WriteIndented让输出格式更清晰
可选优化点
- 如果需要避免数组中的重复元素,可以在添加前检查
((List<string>)parentDict[parentKey]).Contains(lastElement) - 如果最后一个节点不是字符串类型,可以将
List<string>改为List<object>或者对应的数据类型
内容的提问来源于stack exchange,提问作者christopher_h
相关产品推荐
相关产品推荐

