博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Json转Dictionary
阅读量:5304 次
发布时间:2019-06-14

本文共 2816 字,大约阅读时间需要 9 分钟。

如果只是想把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;
}

 

转载于:https://www.cnblogs.com/yiyecao/p/11162279.html

你可能感兴趣的文章
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
BootStrap2学习日记2--将固定布局换成响应式布局
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>
数据库的高级查询
查看>>
机器视觉:SSD Single Shot MultiBox Detector
查看>>
201521123044 《Java程序设计》第1周学习总结
查看>>
MIT Scheme 的基本使用
查看>>
程序员的“机械同感”
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
c++回调函数
查看>>