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