代码如下:
/// <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数据库中