如何向匿名类型添加新值

时间:2018-02-04 18:07:13

标签: c# json

是否可以向现有的json对象添加值?

我的示例代码

var obj = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3" };

这就是我尝试做的事情

obj.AddValue(Val4, "myVal4");

3 个答案:

答案 0 :(得分:4)

var obj = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3" };
尽管有相似之处,

不是JSON。这是一个编译器生成的"匿名类型",这意味着编译器为您创建了一个类型,其中包含三个名为stringVal1和{{1}的Val个属性}。除了你不能说出类型名称(它是匿名的)之外,它是一个非常普通的.NET类。不,您无法在运行时向类中添加额外的属性。

最接近你想要的东西可能Val3,但说实话,这听起来像你正在尝试做一些奇特的事情。

答案 1 :(得分:2)

正如其他人所指出的那样,你在这里处理的是anonymous types,而不是JSON对象。不幸的是,它们是编译代码中的自动生成类型,这意味着它们不能随意更改。

一个简单的解决方法是声明一个新的匿名类型,它可以存储一个额外的字段,并将公共字段的值设置为旧对象的值,如下所示:

var obj_old = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3" };
var obj_new = new { Vall = obj_old.Vall, Val2 = obj_old.Val2, Val3 = obj_old.Val3, Val4 = "myVal4" };

或者,使用附加字段声明对象,该字段的值可在需要时设置:

var obj = new { Vall = "myVal1", Val2 = "myVal2", Val3 = "myVal3", Val4 = String.Empty };
// ...
obj.Val4 = "myVal4";

答案 2 :(得分:0)

C#中匿名类型的属性是只读的,您可以使用Json.Net克隆此对象并添加属性,如下所示:

    var obj = new { ID = 1234, Name = "FooBar" };
    obj = JObject.FromObject(obj).Add("feeClass", "A");

最终Json:

{
  "ID": 1234,
  "Name": "FooBar",
  "feeClass": "A"
}