.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
相关产品推荐
相关产品推荐

