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

如何在动态生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:39:04