首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在expando对象中进行搜索

如何在expando对象中进行搜索
EN

Stack Overflow用户
提问于 2016-07-21 18:02:11
回答 2查看 932关注 0票数 0

我得到了像这样的json对象-

有时候就像这样-

所以对象的顺序是不固定的。在上面的例子中,"CreatedOn“字段需要存储在数据库中。

我正在使用以下代码将其转换为扩展对象-

代码语言:javascript
复制
    JObject jsonObject = JObject.Parse(json);

    // eval into an expando
    dynamic dynObject = ConvertJTokenToObject(jsonObject);

这里是ConvertJTokenToObject -

代码语言:javascript
复制
public object ConvertJTokenToObject(JToken token)
        {
            if (token is JValue)
            {
                return ((JValue)token).Value;
            }

            if (token is JObject)
            {
                ExpandoObject expando = new ExpandoObject();
                (from childToken in ((JToken)token) where childToken is JProperty select childToken as JProperty).ToList().ForEach(property =>
                {
                    ((IDictionary<string, object>)expando).Add(property.Name, ConvertJTokenToObject(property.Value));
                });

                return expando;
            }

            if (token is JArray)
            {
                object[] array = new object[((JArray)token).Count];
                int index = 0;
                foreach (JToken arrayItem in ((JArray)token))
                {
                    array[index] = ConvertJTokenToObject(arrayItem);
                    index++;
                }
                return array;
            }
            throw new ArgumentException(string.Format("Unknown token type '{0}'", token.GetType()), "token");
        }

现在,问题是我不知道哪个“维度”元素会有"CreatedOn“字段。

这在第一种情况下效果很好-

代码语言:javascript
复制
dynObject.context.custom.dimensions[0].CreatedOn

但在另一起案件中,就像它应该的那样-

代码语言:javascript
复制
dynObject.context.custom.dimensions[1].CreatedOn

如何通过字段名搜索扩展对象,如"CreatedOn“,"Status”等

EN

回答 2

Stack Overflow用户

发布于 2016-07-21 18:19:41

既然ExpandoObject实现了IDictionary,你就不能这样做吗:

代码语言:javascript
复制
if (dynObject.context.custom.dimensions[1] as IDictionary<string,object>).ContainsKey("CreatedOn") {
//Your logic here... 
}
票数 0
EN

Stack Overflow用户

发布于 2016-07-21 19:52:30

你将不得不展平Dimensions,我认为你的问题是不能通过名称在expando中找到属性,你可以通过点符号展平expando结构来做到这一点……如果你需要知道这一点,我可以发个帖子。但是你的主要问题源于维度是一个dynamic[],所以你需要得到像var dimensions = dynObject.Context.Custom.dimensions这样的维度,然后像var flattened = FlattenDimensions(dimensions)一样展平它们,这将给你一个字典,比如

扁平化方法

代码语言:javascript
复制
private static Dictionary<string, object> FlattenDimensions(dynamic[] dimensions)
    {
        var flattened = new Dictionary<string, object>();
        foreach (var dimension in dimensions)
        {
            var dict = (IDictionary<string, object>)dimension;
            foreach (var item in dict)
            {
                flattened.Add(item.Key, item.Value);
            }
        }
        return flattened;
    }

您可以调整上面的方法以更好地满足您的需要,但这是一种理想的,并且由于您现在有一个扁平字典,因此您可以搜索CreatedOn或任何其他属性

--希望这是有意义的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38501089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档