正则表达式搭配js轻松处理json文本方便而老古


Posted in Javascript onFebruary 17, 2013

很多群里的朋友经常聊到如何解析Json,通常很多人都会搬出他们珍藏的dll出来,比如Newtonsoft.json.dll,litjson.dll等等。互相吹嘘这些动态链接库的功能如何如何了得,依我看,要解析轻量化类型json,用.net自带的类库就可以胜任了。但是,有一种看起来更方便的老古董——正则表达式,处理json是绰绰有余。

Json(JavaScript Object Notation)作为当今互联网最为一种流行的,超越语言的网络数据交换格式,可以说是“肉多骨少”的一种类型,在网络传输方面大有赶超xml作为传统传输格式的地位,其在REST架构上的应用随着腾讯,淘宝等巨型网络公司的推波助澜,而成为程序员追捧的理想格式。

然而,虽然json在javascript里解析起来轻而易举,但是在.net里却没那么容易。即使微软在.NET Framework 3.5中提供了一个JSON对象的序列化工具(System.Web.Script.Serialization.JavaScriptSerializer),但其本身的强类型属性,让人望而却步。

还好,有正则表达式!

正则表达式

首先申明一下,正则表达式是一直纸老虎,根本就不难。首先让我们搬出一个正在表达式在.net中的实现例子。

有这么一段json格式的文本,从右下图可以清除地看出其结构:

{ 
People: [ 
{ 
Name: "zhangsan", 
Age: 12, 
Married: false 
}, 
{ 
Name: "lisi", 
Age: 24, 
Married: true 
}, 
{ 
Name: "wangwu", 
Age: 40, 
Married: true 
} 
] 
}

正则表达式搭配js轻松处理json文本方便而老古

在c#中要想用正则提取出上述文本里面的有用信息,必须添加支持正则表达式的组件引用。
using System.Text.RegularExpressions;

static void Main(string[] args) 
{ 
string json = "{People:[{Name:\"zhangsan\",Age:12,Married:false},{Name:\"lisi\",Age:24,Married:true},{Name:\"wangwu\",Age:40,Married:true}]}"; 
Regex regex = new Regex(@"Name:\s*""(?'Name'[^""]*)"",\s*Age:\s*(?'Age'[^,]*),\s*Married:\s*(?'Married'[^\}]*)", RegexOptions.IgnoreCase); 
//申明和实例化一个正则表达式对象,这里要加上参数RegexOptions.IgnoreCase,用于忽略文本大小写 
if (regex.IsMatch(json)) 
{ 
MatchCollection matches = regex.Matches(json); 
//上处可以匹配文本里有多组相似的结果全部结果,如果只有一组的话,用Match match = regex.Match(json); 
StringBuilder stringBuilder = new StringBuilder(); 
foreach (Match match in matches) 
{ 
string name = match.Groups["Name"].Value;//此处Name是匹配表达式(?'Name'[^"]*)里的Name,显式分组 
string age = match.Groups["Age"].Value; 
string married = match.Groups["Married"].Value; 
stringBuilder.AppendFormat("Name:{0},Age:{1},Married:{2}\n", name,age,married); 
} 
Console.WriteLine(stringBuilder.ToString()); 
} 
else 
{ 
Console.WriteLine("提取文本失败!"); 
} 
Console.Read(); 
}

如果匹配正确,结果会是如图所示:

正则表达式搭配js轻松处理json文本方便而老古

很多新手都不知道这些步骤怎么来的。在这里我先向大家推荐一款正则表达式测试的小工具。由于是特别针对c#的,所以用起来真的很方便。至于下载地址百度一下就知道了!

 正则表达式搭配js轻松处理json文本方便而老古

这上面的匹配符让我介绍一下。

\s 匹配一个空格    * 匹配次数(这里是无限次,甚至是一次也没有){1,}是至少匹配一次或一次以上

\w匹配一个字母或是数字  \.这是匹配任何一个字符 

\d匹配一个数字,不包括前面的正负符号

()隐式分组   (?'groupname'\w)或者(?<groupname>\w)匹配一个字符的显式分组,包含了一个组名groupname,可以自己随便起名字。

[^\w]这里面的^是匹配除^后面出现的字符的所有字符。比如匹配 name:"haha123",要匹配这里面的haha123,就可以这样:name:"(?'name'[^"]*)表示匹配除"的所有字符haha123

其实正则表达式真正常用的也就是上面那几个了。会了的话正则表达式就轻松掌握了。

接下来还给大家介绍一种解析json的方法。那就是在.net调用javascript的脚本。

调用Javascript

这是一种被人忽略的方法,其实用这种方法解析起来貌似比上面的正则表达式更快速。

大家都知道,在json只是javascript里一种单独列出来的玩意,其语法遵循js,因此用js来原生态地处理json是最好不过了。

using Microsoft.JScript; 
using Microsoft.Vsa; 
using Microsoft.JScript.Vsa;

public static Dictionary<string, string> GetMyValue(string jsonSource, string key1, string key2) 
{ 
Dictionary<string, string> dic = new Dictionary<string, string>(); 
string jsonStr = "function handleJson() {var j=" + jsonSource + ";var arr1=new Array();var arr2=new Array();for(var " + key2 + " in j." + key1 + ") arr1.push(" + key2 + "); return arr1;} handleJson(); "; 
object o = Eval.JScriptEvaluate(jsonStr, VsaEngine.CreateEngine()); 
ArrayObject arr = (ArrayObject)o; 
for (var i = 0; i <= (int)arr.length - 1; i++) 
{ 
dic.Add(arr[i].ToString(), arr[i].ToString()); 
} 
return dic; 
}

这里的代码是我以前做项目的时候临时写的,很乱,大家将就着看看。只是作为一种可行的方法,并不推荐大家用这种方法。有时间大家试试看。

教程每天都更新,欢迎大家继续关注!

Javascript 相关文章推荐
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 Javascript
JS分页控件 可用于无刷新分页
Jul 23 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
Dec 01 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
Mar 03 Javascript
JS与jQuery实现隔行变色的方法
Sep 09 Javascript
React实现点击删除列表中对应项
Jan 10 Javascript
js实现多张图片延迟加载效果
Jul 17 Javascript
vue params、query传参使用详解
Sep 12 Javascript
基于vue-resource jsonp跨域问题的解决方法
Feb 03 Javascript
layui 监听表格复选框选中值的方法
Aug 15 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
May 30 Javascript
vue+axios 拦截器实现统一token的案例
Sep 11 Javascript
jQuery图片播放8款精美插件分享
Feb 17 #Javascript
jQuery性能优化28条建议你值得借鉴
Feb 16 #Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
Feb 16 #Javascript
js nextSibling属性和previousSibling属性概述及使用注意
Feb 16 #Javascript
jQuery事件绑定.on()简要概述及应用
Feb 07 #Javascript
10个基于浏览器的JavaScript调试工具分享
Feb 07 #Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 #Javascript
You might like
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
详解JS函数重载
2014/12/04 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
python 弧度与角度互转实例
2020/04/15 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
python与idea的集成的实现
2020/11/20 Python
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
文秘专业大学生求职信
2013/11/10 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
公务员培的训心得体会
2014/09/01 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
关于Python使用turtle库画任意图的问题
2022/04/01 Python
Java设计模式中的命令模式
2022/04/28 Java/Android