我正在使用Json.Net将json结果反序列化为ExpandoObjects
,使用如下代码:
var converter = new ExpandoObjectConverter();
dynamic d = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);
除了在json架构的根目录下只有一个列表的响应之外,这对所有事情都很有用,如下所示:
string json = @"[{""title"": ""the title""}]";
JsonConvert
的内容是这种方法:
public static T DeserializeObject<T>(string value, params JsonConverter[] converters)
{
return (T)DeserializeObject(value, typeof(T), converters);
}
返回值DeserializeObject
是一个正确构造的List<object>
,其中包含ExpandoObject
,但代码无法尝试将该列表强制转换为ExpandoObject本身(T的值)。 / p>
我有一个失败的单元测试并且可以修复此问题,但我不确定如何将List
直接填入ExpandoObject
。
这可能吗? DynamicObject
有TryGetIndex
所以我假设ExpandoObject
可以有一个索引器。是否有必要通过动态提供索引方法的实现来仔细构建类似于列表的expando实例,或者创建一个非expando DynamicObject
来保存列表并从动态方法调用中调用正确的方法?< / p>
答案 0 :(得分:2)
DynamicObject有TryGetIndex,所以我假设一个ExpandoObject可以有一个索引器
不,它不能。试试吧,它会返回RuntimeBinderException
:
无法将带有[]的索引应用于“System.Dynamic.ExpandoObject”类型的表达式
ExpandoObject
不是列表;它更像是一本字典。
是否有必要通过动态提供索引方法的实现来仔细构建一个类似于列表的expando实例,或者创建一个非expando DynamicObject来保存列表并从动态方法调用中调用正确的方法?
好吧,您可以创建一个行为类似于列表的自定义DynamicObject
,但我认为这样做没有任何好处:您也可以使用普通列表。