如何向匿名类型添加新值?能否向现有JSON对象添加值?
好问题!我来分两部分给你掰扯清楚~
如何向匿名类型添加新值?
首先得明确:C#里的匿名类型默认是只读的,它的属性在编译时就固定死了,没法直接给已有的匿名类型实例硬加新属性。不过有两种变通思路:
创建新的匿名类型(推荐)
最简单的办法就是基于原有匿名类型的属性,生成一个包含新属性的全新匿名类型实例,比如:// 原匿名类型实例 var original = new { Name = "Stein", Score = 95 }; // 生成带新属性的新实例,复用原有属性值 var updated = new { original.Name, original.Score, Grade = "A" };这种方式完全符合强类型的设计,不会有潜在问题。
转成动态类型(不推荐,慎用)
如果你非要“看起来”在原实例上添加属性,可以转成dynamic配合ExpandoObject来模拟,但这会丢失编译时的类型检查,容易出bug:var original = new { Name = "Stein", Score = 95 }; dynamic expando = new ExpandoObject(); // 先把原匿名类型的属性复制过去 foreach (var prop in original.GetType().GetProperties()) { ((IDictionary<string, object>)expando)[prop.Name] = prop.GetValue(original); } // 再添加新属性 expando.Grade = "A";除非是特殊场景,否则不建议这么玩。
如何向已有的JSON对象添加值?
这个要看你用的JSON处理库,主流的两种方案都给你列出来:
1. 使用Newtonsoft.Json(Json.NET)
这是.NET圈子里用得最多的第三方JSON库,修改JSON对象超直接:
using Newtonsoft.Json.Linq; // 把JSON字符串解析成可修改的JObject var jsonObj = JObject.Parse(@"{""Name"":""Stein"", ""Score"":95}"); // 直接添加新的键值对 jsonObj.Add("Grade", "A"); // 转成更新后的JSON字符串 string updatedJson = jsonObj.ToString();
要是你手里已经有JObject实例,直接调用Add方法就行,嵌套对象的修改也同样方便。
2. 使用System.Text.Json(.NET Core 3.0+内置)
如果用的是官方自带的库,分两种情况:
方式一:用JsonNode(.NET 6+推荐)
.NET 6之后新增的JsonNode支持直接修改JSON结构,非常省心:
using System.Text.Json.Nodes; // 解析JSON字符串为JsonNode JsonNode jsonNode = JsonNode.Parse(@"{""Name"":""Stein"", ""Score"":95}"); // 直接添加新属性 jsonNode["Grade"] = "A"; // 转成更新后的JSON字符串 string updatedJson = jsonNode.ToJsonString();
方式二:兼容低版本的写法
如果是.NET 6以下的版本,得先解析成JsonDocument,再构建新的JsonObject:
using System.Text.Json; using System.Text; // 解析原JSON using var doc = JsonDocument.Parse(@"{""Name"":""Stein"", ""Score"":95}"); // 用Utf8JsonWriter构建新的JSON对象 using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream); writer.WriteStartObject(); // 先把原有属性复制进去 foreach (var prop in doc.RootElement.EnumerateObject()) { prop.WriteTo(writer); } // 添加新属性 writer.WriteString("Grade", "A"); writer.WriteEndObject(); writer.Flush(); // 转成字符串输出 string updatedJson = Encoding.UTF8.GetString(stream.ToArray());
内容的提问来源于stack exchange,提问作者SteinTech
相关产品推荐
相关产品推荐

