用正则表达式和js轻松处理json文本

万事开头难

      很多群里的朋友经常聊到如何解析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
    }
  ]
}

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

using System.Text.RegularExpressions;
View Code
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();
        }

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

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

 

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

\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;
View Code
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;
        }

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

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

转载于:https://www.cnblogs.com/uu102/archive/2012/10/12/2721580.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 不支持。 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于 JavaScript 对象表示法,但是它也可以在其他语言中使用。 JSON 用于在网络上传输数据,它是一个文本格式,用于描述由属性名称和值组成的数据对象。 JSON 不支持正则表达式,因为正则表达式是用来匹配和操作文本的,而 JSON 是用来描述和传输数据的。 ### 回答2: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于存储和传输结构化的数据。它是基于JavaScript的一个子集,因此可以直接在JavaScript中使用。 JSON本身并不支持正则表达式。它只是一种用于描述数据结构的格式,并不涉及数据的处理。但是,在使用JSON的场景下,可以通过JavaScript语言的正则表达式功能来处理JSON数据。 在JavaScript中,可以使用正则表达式来对JSON字符串进行一些特定的处理,比如搜索、匹配、替换等操作。通过使用正则表达式的相应方法(如RegExp对象的test()、exec()和replace()等方法),可以对JSON数据进行自定义的处理。 但需要注意的是,在处理JSON数据时,应当谨慎使用正则表达式正则表达式的复杂性会导致性能下降,尤其是在大规模的数据处理时。因此,在实际应用中,应当根据具体需求和性能要求,合理选择是否使用正则表达式处理JSON数据。 ### 回答3: JSON(JavaScript Object Notation)是一种用于数据传输和存储的轻量级数据交换格式,它主要用于前后端数据交互以及API的调用。JSON本身并不支持直接使用正则表达式。 在JSON中,我们只能使用一些基本的数据类型,如字符串、数字、布尔值、数组和对象等。而不像某些编程语言(例如JavaScript)中,可以直接使用正则表达式的特性。 然而,我们可以使用字符串来表示正则表达式,并在JSON中进行传输或存储。通常,我们可以将正则表达式作为一个字符串值,与其他键值对一起构建一个JSON对象。 例如,我们可以将正则表达式对象表示为一个字符串,然后在JSON中使用该字符串。在接收JSON数据时,我们可以将该字符串解析为正则表达式对象,然后进行进一步的处理和匹配。 总结来说,JSON本身不直接支持正则表达式,但我们可以将正则表达式作为字符串值嵌入到JSON中,以达到传输和存储的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值