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

如何向匿名类型添加新值?能否向现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:32:59