如何在动态生成的JSON中赋值并避免JObject被覆盖
问题根源
你的代码核心问题出在非数组节点的创建逻辑:不管对应节点是否已经存在,每次遍历到非数组的中间节点时,都会直接执行parent[currentElement] = new JObject()强制覆盖原有对象,之前已经写入该节点的所有内容都会被清空,自然只有最后一次调用方法的赋值能保留下来。
调整方案
主要修改3处逻辑:
- 非数组中间节点仅在不存在时才创建,不强制覆盖
- 优化路径遍历逻辑,避免动态修改拆分后的路径段数组导致的逻辑混乱
- 数组节点的判断和取值逻辑与节点创建逻辑解耦
修正后的代码
private static void GenerateElement(JObject parent, string path, string value) { var parts = path.Split('.'); // 用索引遍历路径段,无需动态修改parts数组 for (int i = 0; i < parts.Length; i++) { var currentElement = parts[i]; bool isLastElement = i == parts.Length - 1; bool isArrayElement = currentElement.Contains("[0]"); string elementName = isArrayElement ? currentElement.Substring(0, currentElement.IndexOf("[0]")) : currentElement; if (isLastElement) { // 最后一个节点直接赋值 parent[currentElement] = value; break; } // 处理中间节点:不存在才创建,避免覆盖已有内容 if (isArrayElement) { if (parent[elementName] == null) { parent[elementName] = new JArray(new JObject()); } // 数组节点跳到数组第一个元素作为下一级父节点 parent = (parent[elementName] as JArray)[0] as JObject; } else { if (parent[elementName] == null) { parent[elementName] = new JObject(); } // 跳到当前节点作为下一级父节点 parent = parent[elementName] as JObject; } } }
内容的提问来源于stack exchange,提问作者campi
相关产品推荐
相关产品推荐

