zoukankan      html  css  js  c++  java
  • Json转Dictionary

    如果只是想把Json转成key value的话,对于复杂的json,有时候jsonconvert转换不成功.

    在网上找到一个利用正则表达式转字典的帖子,但现在找不到原帖了.

    该帖子是把json的所有嵌套对像均转换成键值对形式.该帖子中@"""(.+?)"": {0,1}([[sS]+?]|null|"".+?""|-{0,1}d*)")正则表达式未考虑小数点的情况,

    在此做一个修改@"""(.+?)"": {0,1}([[sS]+?]|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}([[sS]+?]|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, @"{[sS]+?}");//使用正则表达式匹配出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}([[sS]+?]|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(), @"{[sS]+?}");//使用正则表达式匹配出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;
    }

  • 相关阅读:
    剑指offer 数值的整数次方
    剑指offer 链表中倒数第K个节点
    剑指offer反转链表
    剑指offer 栈的压入弹出 顺序
    剑指offer 二叉搜索树后续遍历序列 判断
    剑指offer 复杂链表的复制 (有向图的复制)
    剑指offer 二叉搜索树与双向链表
    2018/03/15 常用的超全局变量
    2018/03/14 每日一个Linux命令 之 ln
    PHP使用 zip 扩展压缩文件
  • 原文地址:https://www.cnblogs.com/yiyecao/p/11162279.html
Copyright © 2011-2022 走看看