如何遍历List<JsonElement>并设置对象属性值?
解决思路
JsonElement是System.Text.Json中的只读不可变结构,它仅作为JSON数据的只读视图存在,无法直接修改其属性值。要实现修改,需先将其转换为可变的JSON对象类型,修改后再替换原集合中的元素。
方案一:使用.NET 6+ 内置的JsonObject
JsonObject是System.Text.Json在.NET 6及以上版本提供的可变JSON对象类型,步骤如下:
- 遍历集合时通过索引访问元素(避免foreach的副本问题)
- 确认当前JsonElement是对象类型后,反序列化为JsonObject
- 修改JsonObject的属性
- 将修改后的JsonObject重新序列化为JsonElement,替换原集合中的元素
代码示例:
List<JsonElement> exportExported = GetDatas(); for (int i = 0; i < exportExported.Count; i++) { JsonElement element = exportExported[i]; // 确保当前元素是JSON对象 if (element.ValueKind == JsonValueKind.Object) { // 转换为可变JsonObject using JsonObject jsonObj = element.Deserialize<JsonObject>(); if (jsonObj != null) { // 设置目标属性值 jsonObj["reference"] = "test"; // 转回JsonElement并替换原元素 exportExported[i] = JsonSerializer.SerializeToElement(jsonObj); } } System.Threading.Thread.Sleep(2500); }
方案二:使用Newtonsoft.Json的JObject(兼容.NET 5及以下)
如果项目依赖Newtonsoft.Json(Json.NET),可以借助JObject的可变性来实现:
- 将JsonElement转换为JObject
- 修改JObject的属性
- 将修改后的JObject序列化为字符串,再反序列化为JsonElement替换原元素
代码示例:
List<JsonElement> exportExported = GetDatas(); for (int i = 0; i < exportExported.Count; i++) { JsonElement element = exportExported[i]; if (element.ValueKind == JsonValueKind.Object) { // 转换为JObject JObject jObj = JObject.Parse(element.GetRawText()); // 修改属性 jObj["reference"] = "test"; // 转回JsonElement string updatedJson = jObj.ToString(); exportExported[i] = JsonSerializer.Deserialize<JsonElement>(updatedJson); } System.Threading.Thread.Sleep(2500); }
内容的提问来源于stack exchange,提问作者harili
相关产品推荐
相关产品推荐

