【问题标题】:Dynamic variable not working in C# with Json.Net动态变量在 C# 中无法使用 Json.Net
【发布时间】:2016-09-30 22:25:46
【问题描述】:

谁能告诉我为什么在下面的代码中尝试输出“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”属性。

【问题讨论】:

  • 你得到什么错误?
  • 是的,错误信息应该会告诉你到底出了什么问题。
  • The call is ambiguous between the following methods or properties: 'System.Console.WriteLine(string, params object[])'
  • 我在这里在黑暗中拍摄 - 我认为在第一个示例中,编译器足够聪明,可以确定它是一个数组。但在第二个示例中,它正在寻找一个名为Type 的属性,但它并不存在。借用您的代码,只要我在您的 JSON 字符串中明确输入一个名为 Type 的属性,它就会按预期编译。
  • 回答斯坦利/哈维。该错误实际上并没有太大帮助。问题是如果 dJson2 以空值返回,则 Type 属性。例如,您可以在代码中添加“var jType = dJson2.Type”,您会发现 jType 为空。

标签: c# json.net


【解决方案1】:

这是因为 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),否则请求的属性将在 IDictionary<string, JToken> JObject 实现的。

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

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

【讨论】:

  • 嗯。有道理,尽管我不确定这种行为是我喜欢的还是我期望的。奇怪的是它适用于 JArray 但不适用于 JObject。无论如何,演员阵容绝对有效。我最终做的是打开 dJson2.GetType(),转换为实际类型,然后继续。这符合预期,虽然有点冗长....感谢 DolphinSX 的解释。
猜你喜欢
  • 2015-03-11
  • 2022-12-13
  • 2012-12-11
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多