json教程之C#开发json解析类

json开始流行了,性能比xml快,所以好多js类库(如jquery)都支持json格式了,通过ASP.NET与js的结合操作json数据传递应该很爽,所以本文使用C#开发一个json类,在看文章前推荐你一些文章:

实用C#中任意类型数据转成JSON格式数据输出
http://www.aspxcs.net/HTML/1000041074.html
以实例讲解json格式应用的json详细教程
http://www.aspxcs.net/HTML/1004241075.html

好了,说看看这个json类的事情,使用本文中的JSONConvert类可将任意JSON字符串转化为JSONObject或JSONArray对象,并获取需要的值,克服了.NET自带JSON类反序列化时需知道并引用序列化时使用的类的缺点。当然,也可以使用JSONConvert类进行序列化,构造出JSON字符串。

下面是类的源码,可以复制直接使用哦。

//using System.Collections.Generic;  
//using System.Text;  
//using System.Text.RegularExpressions;  

/// <summary>  
/// 类 名:JSONConvert  
/// 描 述:JSON解析类  
/// 编 写:dnawo  
/// 站 点:http://www.mzwu.com/  
/// 日 期:2010-01-06  
/// 版 本:1.1.0  
/// </summary>  
public static class JSONConvert  
{
    #region 全局变量  

    private static JSONObject _json = new JSONObject();//寄存器  
    private static readonly string _SEMICOLON = "@semicolon";//分号转义符  
    private static readonly string _COMMA = "@comma"; //逗号转义符

    #endregion

    #region 字符串转义  
    /// <summary>  
    /// 字符串转义,将双引号内的:和,分别转成_SEMICOLON和_COMMA  
    /// </summary>  
    /// <param name="text"></param>  
    /// <returns></returns>  
    private static string StrEncode(string text)  
    {  
        MatchCollection matches = Regex.Matches(text, "///"[^///"] ///"");  
        foreach (Match match in matches)  
        {  
            text = text.Replace(match.Value, match.Value.Replace(":", _SEMICOLON).Replace(",", _COMMA));  
        }  

        return text;  
    }  

    /// <summary>  
    /// 字符串转义,将_SEMICOLON和_COMMA分别转成:和,  
    /// </summary>  
    /// <param name="text"></param>  
    /// <returns></returns>  
    private static string StrDecode(string text)  
    {  
        return text.Replace(_SEMICOLON, ":").Replace(_COMMA, ",");  
    }

    #endregion

    #region JSON最小单元解析  

    /// <summary>  
    /// 最小对象转为JSONObject  
    /// </summary>  
    /// <param name="text"></param>  
    /// <returns></returns>  
    private static JSONObject DeserializeSingletonObject(string text)  
    {  
        JSONObject jsonObject = new JSONObject();  

        MatchCollection matches = Regex.Matches(text, "(///"(?<key>[^///"] )///":///"(?<value>[^,///"] )///")|(///"(?<key>[^///"] )///":(?<value>[^,///"//}] ))");  
        foreach (Match match in matches)  
        {  
            string value = match.Groups["value"].Value;  
            jsonObject.Add(match.Groups["key"].Value, _json.ContainsKey(value) ? _json[value] : StrDecode(value));  
        }  

        return jsonObject;  
    }  

    /// <summary>  
    /// 最小数组转为JSONArray  
    /// </summary>  
    /// <param name="text"></param>  
    /// <returns></returns>  
    private static JSONArray DeserializeSingletonArray(string text)  
    {  
        JSONArray jsonArray = new JSONArray();  

        MatchCollection matches = Regex.Matches(text, "(///"(?<value>[^,///"] )/")|(?<value>[^,//[//]] )");  
        foreach (Match match in matches)  
        {  
            string value = match.Groups["value"].Value;  
            jsonArray.Add(_json.ContainsKey(value) ? _json[value] : StrDecode(value));  
        }  

        return jsonArray;  
    }  

    /// <summary>  
    /// 反序列化  
    /// </summary>  
    /// <param name="text"></param>  
    /// <returns></returns>  
    private static string Deserialize(string text)  
    {  
        text = StrEncode(text);//转义;和,  

        int count = 0;  
        string key = string.Empty;  
        string pattern = "(//{[^//[//]//{//}] //})|(//[[^//[//]//{//}] //])";  

        while (Regex.IsMatch(text, pattern))  
        {  
            MatchCollection matches = Regex.Matches(text, pattern);  
            foreach (Match match in matches)  
            {  
                key = "___key"   count   "___";  

                if (match.Value.Substring(0, 1) == "{")  
                    _json.Add(key, DeserializeSingletonObject(match.Value));  
                else
                    _json.Add(key, DeserializeSingletonArray(match.Value));  

                text = text.Replace(match.Value, key);  

                count ;  
            }  
        }  
        return text;  
    }

    #endregion

    #region 公共接口  

    /// <summary>  
    /// 序列化JSONObject对象  
    /// </summary>  
    /// <param name="text"></param>  
    /// <returns></returns>  
    public static JSONObject DeserializeObject(string text)  
    {  
        return _json[Deserialize(text)] as JSONObject;  
    }  

    /// <summary>  
    /// 序列化JSONArray对象  
    /// </summary>  
    /// <param name="text"></param>  
    /// <returns></returns>  
    public static JSONArray DeserializeArray(string text)  
    {  
        return _json[Deserialize(text)] as JSONArray;  
    }  
      
    /// <summary>  
    /// 反序列化JSONObject对象  
    /// </summary>  
    /// <param name="jsonObject"></param>  
    /// <returns></returns>  
    public static string SerializeObject(JSONObject jsonObject)  
    {  
        StringBuilder sb = new StringBuilder();  
        sb.Append("{");  
        foreach (KeyValuePair<string, object> kvp in jsonObject)  
        {  
            if (kvp.Value is JSONObject)  
            {  
                sb.Append(string.Format("/"{0}/":{1},", kvp.Key, SerializeObject((JSONObject)kvp.Value)));  
            }  
            else if (kvp.Value is JSONArray)  
            {  
                sb.Append(string.Format("/"{0}/":{1},", kvp.Key, SerializeArray((JSONArray)kvp.Value)));  
            }  
            else if (kvp.Value is String)  
            {  
                sb.Append(string.Format("/"{0}/":/"{1}/",", kvp.Key, kvp.Value));  
            }  
            else
            {  
                sb.Append(string.Format("/"{0}/":/"{1}/",", kvp.Key, ""));  
            }  
        }  
        if (sb.Length > 1)  
            sb.Remove(sb.Length - 1, 1);  
        sb.Append("}");  
        return sb.ToString();  
    }  
      
    /// <summary>  
    /// 反序列化JSONArray对象  
    /// </summary>  
    /// <param name="jsonArray"></param>  
    /// <returns></returns>  
    public static string SerializeArray(JSONArray jsonArray)  
    {  
        StringBuilder sb = new StringBuilder();  
        sb.Append("[");  
        for (int i = 0; i < jsonArray.Count; i )  
        {  
            if (jsonArray[i] is JSONObject)  
            {  
                sb.Append(string.Format("{0},", SerializeObject((JSONObject)jsonArray[i])));  
            }  
            else if (jsonArray[i] is JSONArray)  
            {  
                sb.Append(string.Format("{0},", SerializeArray((JSONArray)jsonArray[i])));  
            }  
            else if (jsonArray[i] is String)  
            {  
                sb.Append(string.Format("/"{0}/",", jsonArray[i]));  
            }  
            else
            {  
                sb.Append(string.Format("/"{0}/",", ""));  
            }  

        }  
        if (sb.Length > 1)  
            sb.Remove(sb.Length - 1, 1);  
        sb.Append("]");  
        return sb.ToString();  
    }
    #endregion  
}  

/// <summary>  
/// 类 名:JSONObject  
/// 描 述:JSON对象类  
/// 版 本:1.1.0  
/// 更新历史:  
///     2010-01-06 继承Dictionary<TKey, TValue>代替this[]  
/// </summary>  
public class JSONObject : Dictionary<string, object>  
{}  

/// <summary>  
/// 类 名:JSONArray  
/// 描 述:JSON数组类  
/// 版 本:1.1.0  
/// 更新历史:  
///     2010-01-06 继承List<T>代替this[]  
/// </summary>  
public class JSONArray : List<object>  
{}
嗯,json写完了,下面来看下使用的方法:

//序列化  
JSONArray jsonArray = new JSONArray();  
jsonArray.Add("2006");  
jsonArray.Add("2007");  
jsonArray.Add("2008");  
jsonArray.Add("2009");  
jsonArray.Add("2010");  

JSONObject jsonObject = new JSONObject();  
jsonObject.Add("domain", "mzwu.com");  
jsonObject.Add("years", jsonArray);  

Console.WriteLine(JSONConvert.SerializeObject(jsonObject));  

//反序列化 "{/"domain/":/"mzwu.com/",/"years/":[2006,2007,2008,2009,2010]}"  
JSONObject json = JSONConvert.DeserializeObject(JSONConvert.SerializeObject(jsonObject));  
if (json != null)  
{  
    Console.WriteLine(json["domain"]);  
    Console.WriteLine(((JSONArray)json["years"])[3]);  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值