0

このようなjsonオブジェクトを取得しました-

ここに画像の説明を入力

そして時々このような -

ここに画像の説明を入力

したがって、オブジェクトの順序は固定されていません。上記の例では、「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 を検索する方法

4

2 に答える 2

0

ディメンションを平坦化する必要があります。問題は、expando で名前を介してプロパティを見つけられないことだと思います。expando 構造をドット表記で平坦化することでそれを行うことができます...それを知る必要がある場合は、somat を投稿できます。しかし、あなたの主な問題は、寸法が であることから生じるため、次のような寸法を取得してから、このように平らにdynamic[]する必要があります。これにより、次のような辞書が得られますvar dimensions = dynObject.Context.Custom.dimensionsvar flattened = FlattenDimensions(dimensions)

ここに画像の説明を入力

平坦化方法

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 またはその他のプロパティを検索できます。

--これが理にかなっていることを願っています

于 2016-07-21T11:52:30.313 に答える
0

ExpandoObject は IDictionary を実装しているため、次のようなことはできません。

if (dynObject.context.custom.dimensions[1] as IDictionary<string,object>).ContainsKey("CreatedOn") {
//Your logic here... 
}
于 2016-07-21T10:19:40.693 に答える