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

.NET Core解析JSON遇重复键报错如何不修改源文件重命名重复键

问题原因

报错是因为Dictionary<string, string>不允许插入重复键,当JSON中出现重复的key+||+label组合时就会触发异常。不需要修改原始JSON,只需在插入字典前对重复键做重命名处理即可。

修复方案

在内层遍历字段的逻辑中新增重复键检测,遇到已存在的键时自动追加数字后缀,直到生成唯一键再插入字典,修改后的代码如下:

public IActionResult Entry(string id)
{
    var entry = _service.GetALLEntry(id);
    JArray json = JArray.Parse(entry.DataContent);
    Dictionary<string, string> dict = new Dictionary<string, string>();
    foreach (JValue item in json)
    {
        JObject js = JObject.Parse(item.Value.ToString());
        foreach (var _it in js)
        {
            if (_it.Key != "fields")
                continue;
            foreach (var field in _it.Value)
            {
                string baseKey = field.Value<string>("key") + "||" + field.Value<string>("label");
                string finalKey = baseKey;
                int suffix = 1;
                // 循环检测键是否存在,存在则追加递增序号
                while (dict.ContainsKey(finalKey))
                {
                    finalKey = $"{baseKey}_{suffix}";
                    suffix++;
                }
                dict.Add(finalKey, field.Value<string>("value"));
            }
        }
    }
    return View(dict);
}
可选优化方案

如果不需要保留所有重复键的取值,可以根据业务需求选择更简单的处理方式:

  • 保留第一个出现的重复键取值:插入前判断键不存在再添加
    if(!dict.ContainsKey(baseKey))
    {
        dict.Add(baseKey, field.Value<string>("value"));
    }
    
  • 保留最后一个出现的重复键取值:用字典索引赋值直接覆盖旧值,不会抛出重复键异常
    dict[baseKey] = field.Value<string>("value");
    
  • 若JSON体积过大导致内存占用过高,可以改用JsonReader做流式解析,避免一次性加载整个JSON到内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:03