如何在expando对象中搜索

时间:2016-07-21 10:02:11

标签: c# .net json expandoobject expando

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

enter image description here

有时像这样 -

enter image description here

因此对象的顺序不固定。在上面的示例中,“CreatedOn”字段需要存储在DB中。

我正在使用以下代码将其转换为expandoobject -

    JObject jsonObject = JObject.Parse(json);

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

这里是ConvertJTokenToObject -

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”字段。

这适用于第一种情况 -

dynObject.context.custom.dimensions[0].CreatedOn

但在另一种情况下打破,应该是 -

dynObject.context.custom.dimensions[1].CreatedOn

如何通过“CreatedOn”,“Status”等字段名称搜索expandoobject。

2 个答案:

答案 0 :(得分:0)

由于ExpandoObject实现了IDictionary,你不能只做:

if (dynObject.context.custom.dimensions[1] as IDictionary<string,object>).ContainsKey("CreatedOn") {
//Your logic here... 
}

答案 1 :(得分:0)

你必须压扁Dimensions,我认为你的问题不是通过名称在expando中找到属性,你可以通过点符号展平expando结构来做到这一点...如果你需要知道,我可以发布somat 。但是您的主要问题源于维度dynamic[],因此您需要获得var dimensions = dynObject.Context.Custom.dimensions之类的维度,然后像var flattened = FlattenDimensions(dimensions)那样展平它们,这会给你一个字典如

enter image description here

展平方法

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或任何其他属性

- 希望这是有道理的