JObject——转化为字典IDictionary<string, object>

代码如下:

 /// <summary>
    /// JObject扩展
    /// </summary>
    public static class JObjectExtensions
    {
        /// <summary>
        /// 将JObject转化成字典
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static IDictionary<string, object> ToDictionary(this JToken json)
        {
            var propertyValuePairs = json.ToObject<Dictionary<string, object>>();
            ProcessJObjectProperties(propertyValuePairs);
            ProcessJArrayProperties(propertyValuePairs);
            return propertyValuePairs;
        }

        private static void ProcessJObjectProperties(IDictionary<string, object> propertyValuePairs)
        {
            var objectPropertyNames = (from property in propertyValuePairs
                                       let propertyName = property.Key
                                       let value = property.Value
                                       where value is JObject
                                       select propertyName).ToList();

            objectPropertyNames.ForEach(propertyName => propertyValuePairs[propertyName] = ToDictionary((JObject)propertyValuePairs[propertyName]));
        }

        private static void ProcessJArrayProperties(IDictionary<string, object> propertyValuePairs)
        {
            var arrayPropertyNames = (from property in propertyValuePairs
                                      let propertyName = property.Key
                                      let value = property.Value
                                      where value is JArray
                                      select propertyName).ToList();

            arrayPropertyNames.ForEach(propertyName => propertyValuePairs[propertyName] = ToArray((JArray)propertyValuePairs[propertyName]));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static object[] ToArray(this JArray array)
        {
            return array.ToObject<object[]>().Select(ProcessArrayEntry).ToArray();
        }

        private static object ProcessArrayEntry(object value)
        {
            if (value is JObject)
            {
                return ToDictionary((JObject)value);
            }
            if (value is JArray)
            {
                return ToArray((JArray)value);
            }
            return value;
        }

    }


做以上处理 主要是Y因为

将JObject转化为字典对象,只会转化一级节点,更深的节点依旧为Jobject 或是 JArray对象。也就是说转化不彻底,不能达到目的。

这样Json数据 转化为 JObject 再转化为 /Dictionary<string, object>

就可以更加方便的对数据做处理

例如:

将接收到的JSON字符串转化为BsonDocument,存储到MongoDB数据库中。

可以使用

BsonDocument.Parse(json)

但是存在的问题是json中的数据是没有类型的,对于日期类型的值,就会以字符串的形式存储到数据库中,这就不符合要求。

因此只有将JSON字符串转成对应的对象,才可以有数据类型,以ISOdate类型将日期的值存储起来。

于是将  JSON=>Dictionary=>BsonDocument

JSON本身是一个JObject对象,需要做转化处理如上面的代码

private BsonDocument JsonConvertToBsonDoc(string json)
        {
            var token = JToken.Parse(json); var dict = token.ToDictionary();
            return BsonDocument.Create(dict);
        }

尝试了很多种方法,如上终于解决,顺利将数据存储到MongoDB数据库中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值