【问题标题】:Can an ExpandoObject be a list?ExpandoObject 可以是列表吗?
【发布时间】:2014-06-05 00:05:10
【问题描述】:

我正在使用 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&lt;object&gt;,其中包含ExpandoObject,但代码尝试将该列表转换为ExpandoObject 本身(T 的值)失败。

我有一个失败的单元测试,可以解决这个问题,但我不确定如何将 List 直接填充到 ExpandoObject 中。

这可能吗? DynamicObjectTryGetIndex 所以我假设 ExpandoObject 可以有一个索引器。是否有必要通过动态提供索引方法的实现来仔细构造类似列表的 expando 实例,或者创建一个非扩展 DynamicObject 来保存列表并从动态方法调用中正确调用方法?

【问题讨论】:

    标签: c# json json.net dynamic-language-runtime expandoobject


    【解决方案1】:

    DynamicObject 有 TryGetIndex,所以我假设 ExpandoObject 可以有一个索引器

    不,它不能。试试看,它返回一个RuntimeBinderException

    无法将 [] 索引应用于“System.Dynamic.ExpandoObject”类型的表达式

    ExpandoObject 不是列表;它更像是一本字典。

    是否有必要通过动态提供索引方法的实现来仔细构造类似列表的 expando 实例,或者创建一个非扩展 DynamicObject 来保存列表并从动态方法调用中正确调用方法?

    好吧,您可以创建一个行为类似于列表的自定义 DynamicObject,但我认为这样做没有任何好处:您还不如使用普通列表。

    【讨论】:

    • 我正在试验一个总是返回动态对象的休息客户端。如果您知道我的意思,那么只有最外层的消费者代码会知道需要一个列表。所以我有一个列表的代码路径(client.GetList())和另一个代码路径(client.Get())。我想这不是世界上最糟糕的事情。 Json.Net 的 JObject 可以是一个列表,但我试图避免它,因为它还有一些我不喜欢的其他行为。
    • 你是对的。我需要向 JSonConvert 提供我所缺少的提示: if (content.StartsWith("[")) return JsonConvert.DeserializeObject>(content, converter); return JsonConvert.DeserializeObject(content, converter);
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2020-01-12
    • 2021-10-04
    • 2015-03-02
    • 2017-11-07
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多