动态变量在带有Json.Net的C#中不起作用

本文关键字:不起作用 Net Json 变量 动态 | 更新日期: 2023-09-27 18:09:49

有人能告诉我为什么在下面的代码中输出"dJson2.Type"时出错吗?

    string Json1= @"[{'Id':1, 'FirstName':'John', 'LastName':'Smith'}, {'Id':2, 'FirstName':'Jane', 'LastName':'Doe'}]";
    dynamic dJson1= JsonConvert.DeserializeObject(Json1);
    Console.WriteLine(dJson1.GetType());
    Console.WriteLine(dJson1.Type);
    string Json2 = @"{'Id':1, 'FirstName':'John', 'LastName':'Smith'}";
    dynamic dJson2 = JsonConvert.DeserializeObject(Json2);
    Console.WriteLine(dJson2.GetType());
    Console.WriteLine(dJson2.Type);

程序在Console.WriteLine(dJson2.Type(语句中终止。程序的输出是…

Newtonsoft.Json.Linq.JArray
Array
Newtonsoft.Json.Linq.JObject
(should say Object here, I think)

通过检查局部变量,dJson2具有值为"Object"的"Type"属性。

动态变量在带有Json.Net的C#中不起作用

这是因为JObject的行为与System.Dynamic.ExpandoObject类似。请尝试将示例更改为:
  string Json2 = @"{'Id':1, 'FirstName':'John', 'LastName':'Smith'}";
  dynamic dJson2 = JsonConvert.DeserializeObject(Json2);
  dJson2.Type = "mynewfield";
  Console.WriteLine(dJson2.GetType());
  Console.WriteLine(dJson2.Type);

如果您想获得底层类型的属性,则需要将其强制转换(转换为JToken或JObject(,否则将在中搜索请求的属性JObject实现的IDictionary<string, JToken>

这个例子可能会有所帮助:

  dynamic oobj = new JObject();
  oobj.Type = "TEST";
  Console.WriteLine(oobj.Type);
  Console.WriteLine(((JObject)oobj).Type);