如果只是想把Json转成key value的话,对于复杂的json,有时候jsonconvert转换不成功.
在网上找到一个利用正则表达式转字典的帖子,但现在找不到原帖了.
该帖子是把json的所有嵌套对像均转换成键值对形式.该帖子中@"""(.+?)"": {0,1}(\[[\s\S]+?\]|null|"".+?""|-{0,1}\d*)")正则表达式未考虑小数点的情况,
在此做一个修改@"""(.+?)"": {0,1}(\[[\s\S]+?\]|null|"".+?""|(\-|\+)?\d+(\.\d+)?)".
在写反射时,需要把json转换成方法的参数,因此只需解析出最外层的对象即可.
以下是两种解析方式:
1.只解析最外层对象
/// <summary>
/// Json格式转换成键值对,键值对中的Key需要区分大小写 ,不考虑json本身就是一个数组的形式
/// </summary> /// <param name="JsonData">需要转换的Json文本数据</param> /// <returns></returns> public static Dictionary<string, object> ToDictionary(string JsonData) { object Data = null; Dictionary<string, object> Dic = new Dictionary<string, object>();MatchCollection Match = Regex.Matches(JsonData, @"""(.+?)"": {0,1}(\[[\s\S]+?\]|null|"".+?""|(\-|\+)?\d+(\.\d+)?)");//使用正则表达式匹配出JSON数据中的键与值 foreach (Match item in Match) { try { if (item.Groups[2].ToString().ToLower() == "null") Data = null;//如果数据为null(字符串类型),直接转换成null else Data = item.Groups[2].ToString(); //数据为数字、字符串中的一类,直接写入 Dic.Add(item.Groups[1].ToString(), Data); } catch { } } return Dic; }
2.解析所有嵌套的对象(递归实现)
/// <summary>
/// Json格式转换成键值对,键值对中的Key需要区分大小写 /// </summary> /// <param name="JsonData">需要转换的Json文本数据</param> /// <returns></returns> public static Dictionary<string, object> ToDictionary(string JsonData) { object Data = null; Dictionary<string, object> Dic = new Dictionary<string, object>(); if (JsonData.StartsWith("[")) { //如果目标直接就为数组类型,则将会直接输出一个Key为List的List<Dictionary<string, object>>集合 //使用示例List<Dictionary<string, object>> ListDic = (List<Dictionary<string, object>>)Dic["List"]; List<Dictionary<string, object>> List = new List<Dictionary<string, object>>(); MatchCollection ListMatch = Regex.Matches(JsonData, @"{[\s\S]+?}");//使用正则表达式匹配出JSON数组 foreach (Match ListItem in ListMatch) { List.Add(ToDictionary(ListItem.ToString()));//递归调用 } Data = List; Dic.Add("List", Data); } else { MatchCollection Match = Regex.Matches(JsonData, @"""(.+?)"": {0,1}(\[[\s\S]+?\]|null|"".+?""|(\-|\+)?\d+(\.\d+)?*)");//使用正则表达式匹配出JSON数据中的键与值 foreach (Match item in Match) { try { if (item.Groups[2].ToString().StartsWith("[")) { //如果目标是数组,将会输出一个Key为当前Json的List<Dictionary<string, object>>集合 //使用示例List<Dictionary<string, object>> ListDic = (List<Dictionary<string, object>>)Dic["Json中的Key"]; List<Dictionary<string, object>> List = new List<Dictionary<string, object>>(); MatchCollection ListMatch = Regex.Matches(item.Groups[2].ToString(), @"{[\s\S]+?}");//使用正则表达式匹配出JSON数组 foreach (Match ListItem in ListMatch) { List.Add(ToDictionary(ListItem.ToString()));//递归调用 } Data = List; } else if (item.Groups[2].ToString().ToLower() == "null") Data = null;//如果数据为null(字符串类型),直接转换成null else Data = item.Groups[2].ToString(); //数据为数字、字符串中的一类,直接写入 Dic.Add(item.Groups[1].ToString(), Data); } catch { } } } return Dic; }