我看到了两个问题,阻止了代码的工作:
您的 jsonObject 声明语法不正确。将其声明为字符串,并在字符串内使用转义“斜杠 + 双引号”来表示每个双引号:
var jsonObject = "{\"att1\": \"val1\",\"att2\": \"val2\",\"att3\": \"val3\",\"att4\": \"val4\"}";
然后,在使用 Newtonsoft.Json.Converters
时,类型参数中需要使用 ExpandoObject
,而不是 List<ExpandoObject>
,因为 ExpandoObject 已经包含字典(而非列表):
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonObject, expConverter);
以下代码修复了上述两个问题,并在屏幕上显示了键/值对:
using System.Dynamic;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
void Main()
{
var jsonObject =
"{\"att1\": \"val1\",\"att2\": \"val2\",\"att3\": \"val3\",\"att4\": \"val4\"}";
var expConverter = new ExpandoObjectConverter();
dynamic obj =
JsonConvert.DeserializeObject<ExpandoObject>(jsonObject, expConverter);
foreach (var o in obj)
{
Console.WriteLine($"{o.Key}, {o.Value}");
}
}
输出结果为:
att1, val1
att2, val2
att3, val3
att4, val4
注意:您可以轻松地将Expando转换为字典(内部已经是IDictionary
),如下所示:
var dict = new Dictionary<string, object>(obj);
这允许在LinqPad中执行dict.Dump()
(ExpandoObject不支持)
如果您正在LinqPad中尝试,请按
F4并添加NUGET包
Json.NET
(如果您没有付费版本的LinqPad,则NUGET功能受到限制-在这种情况下,请尝试
Rock.Core.Newtonsoft
)。
dynamic
。将整个内容强制转换为List<ExpandoObject>
。 - Erwindynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonObject, expConverter);
运行得非常好... - stefankmitph