• 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字符串。

    下面是类的源码:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Text.RegularExpressions;
      6 
      7 namespace JSONTest
      8 {
      9     class JSONConvert
     10     {
     11         #region 全局变量
     12 
     13         private static JSONObject _json = new JSONObject();//寄存器 
     14         private static readonly string _SEMICOLON = "@semicolon";//分号转义符 
     15         private static readonly string _COMMA = "@comma"; //逗号转义符 
     16 
     17         #endregion
     18 
     19         #region 字符串转义
     20         /// <summary> 
     21         /// 字符串转义,将双引号内的:和,分别转成_SEMICOLON和_COMMA 
     22         /// </summary> 
     23         /// <param name="text"></param> 
     24         /// <returns></returns> 
     25         private static string StrEncode(string text)
     26         {
     27             MatchCollection matches = Regex.Matches(text, "\\\"[^\\\"]+\\\"");
     28             foreach (Match match in matches)
     29             {
     30                 text = text.Replace(match.Value, match.Value.Replace(":", _SEMICOLON).Replace(",", _COMMA));
     31             }
     32 
     33             return text;
     34         }
     35 
     36         /// <summary> 
     37         /// 字符串转义,将_SEMICOLON和_COMMA分别转成:和, 
     38         /// </summary> 
     39         /// <param name="text"></param> 
     40         /// <returns></returns> 
     41         private static string StrDecode(string text)
     42         {
     43             return text.Replace(_SEMICOLON, ":").Replace(_COMMA, ",");
     44         }
     45 
     46         #endregion
     47 
     48         #region JSON最小单元解析
     49 
     50         /// <summary> 
     51         /// 最小对象转为JSONObject 
     52         /// </summary> 
     53         /// <param name="text"></param> 
     54         /// <returns></returns> 
     55         private static JSONObject DeserializeSingletonObject(string text)
     56         {
     57             JSONObject jsonObject = new JSONObject();
     58 
     59             MatchCollection matches = Regex.Matches(text, "(\\\"(?<key>[^\\\"]+)\\\":\\\"(?<value>[^,\\\"]+)\\\")|(\\\"(?<key>[^\\\"]+)\\\":(?<value>[^,\\\"\\}]+))");
     60             foreach (Match match in matches)
     61             {
     62                 string value = match.Groups["value"].Value;
     63                 jsonObject.Add(match.Groups["key"].Value, _json.ContainsKey(value) ? _json[value] : StrDecode(value));
     64             }
     65 
     66             return jsonObject;
     67         }
     68 
     69         /// <summary> 
     70         /// 最小数组转为JSONArray 
     71         /// </summary> 
     72         /// <param name="text"></param> 
     73         /// <returns></returns> 
     74         private static JSONArray DeserializeSingletonArray(string text)
     75         {
     76             JSONArray jsonArray = new JSONArray();
     77 
     78             MatchCollection matches = Regex.Matches(text, "(\\\"(?<value>[^,\\\"]+)\")|(?<value>[^,\\[\\]]+)");
     79             foreach (Match match in matches)
     80             {
     81                 string value = match.Groups["value"].Value;
     82                 jsonArray.Add(_json.ContainsKey(value) ? _json[value] : StrDecode(value));
     83             }
     84 
     85             return jsonArray;
     86         }
     87 
     88         /// <summary> 
     89         /// 反序列化 
     90         /// </summary> 
     91         /// <param name="text"></param> 
     92         /// <returns></returns> 
     93         private static string Deserialize(string text)
     94         {
     95             text = StrEncode(text);//转义;和, 
     96 
     97             int count = 0;
     98             string key = string.Empty;
     99             string pattern = "(\\{[^\\[\\]\\{\\}]+\\})|(\\[[^\\[\\]\\{\\}]+\\])";
    100 
    101             while (Regex.IsMatch(text, pattern))
    102             {
    103                 MatchCollection matches = Regex.Matches(text, pattern);
    104                 foreach (Match match in matches)
    105                 {
    106                     key = "___key" + count + "___";
    107 
    108                     if (match.Value.Substring(0, 1) == "{")
    109                         _json.Add(key, DeserializeSingletonObject(match.Value));
    110                     else
    111                         _json.Add(key, DeserializeSingletonArray(match.Value));
    112 
    113                     text = text.Replace(match.Value, key);
    114 
    115                     count++;
    116                 }
    117             }
    118             return text;
    119         }
    120 
    121         #endregion
    122 
    123         #region 公共接口
    124 
    125         /// <summary> 
    126         /// 序列化JSONObject对象 
    127         /// </summary> 
    128         /// <param name="text"></param> 
    129         /// <returns></returns> 
    130         public static JSONObject DeserializeObject(string text)
    131         {
    132             _json = new JSONObject();
    133             return _json[Deserialize(text)] as JSONObject;
    134         }
    135 
    136         /// <summary> 
    137         /// 序列化JSONArray对象 
    138         /// </summary> 
    139         /// <param name="text"></param> 
    140         /// <returns></returns> 
    141         public static JSONArray DeserializeArray(string text)
    142         {
    143             _json = new JSONObject();
    144             return _json[Deserialize(text)] as JSONArray;
    145         }
    146 
    147         /// <summary> 
    148         /// 反序列化JSONObject对象 
    149         /// </summary> 
    150         /// <param name="jsonObject"></param> 
    151         /// <returns></returns> 
    152         public static string SerializeObject(JSONObject jsonObject)
    153         {
    154             StringBuilder sb = new StringBuilder();
    155             sb.Append("{");
    156             foreach (KeyValuePair<string, object> kvp in jsonObject)
    157             {
    158                 if (kvp.Value is JSONObject)
    159                 {
    160                     sb.Append(string.Format("\"{0}\":{1},", kvp.Key, SerializeObject((JSONObject)kvp.Value)));
    161                 }
    162                 else if (kvp.Value is JSONArray)
    163                 {
    164                     sb.Append(string.Format("\"{0}\":{1},", kvp.Key, SerializeArray((JSONArray)kvp.Value)));
    165                 }
    166                 else if (kvp.Value is String)
    167                 {
    168                     sb.Append(string.Format("\"{0}\":\"{1}\",", kvp.Key, kvp.Value));
    169                 }
    170                 else
    171                 {
    172                     sb.Append(string.Format("\"{0}\":\"{1}\",", kvp.Key, ""));
    173                 }
    174             }
    175             if (sb.Length > 1)
    176                 sb.Remove(sb.Length - 1, 1);
    177             sb.Append("}");
    178             return sb.ToString();
    179         }
    180 
    181         /// <summary> 
    182         /// 反序列化JSONArray对象 
    183         /// </summary> 
    184         /// <param name="jsonArray"></param> 
    185         /// <returns></returns> 
    186         public static string SerializeArray(JSONArray jsonArray)
    187         {
    188             StringBuilder sb = new StringBuilder();
    189             sb.Append("[");
    190             for (int i = 0; i < jsonArray.Count; i++)
    191             {
    192                 if (jsonArray[i] is JSONObject)
    193                 {
    194                     sb.Append(string.Format("{0},", SerializeObject((JSONObject)jsonArray[i])));
    195                 }
    196                 else if (jsonArray[i] is JSONArray)
    197                 {
    198                     sb.Append(string.Format("{0},", SerializeArray((JSONArray)jsonArray[i])));
    199                 }
    200                 else if (jsonArray[i] is String)
    201                 {
    202                     sb.Append(string.Format("\"{0}\",", jsonArray[i]));
    203                 }
    204                 else
    205                 {
    206                     sb.Append(string.Format("\"{0}\",", ""));
    207                 }
    208 
    209             }
    210             if (sb.Length > 1)
    211                 sb.Remove(sb.Length - 1, 1);
    212             sb.Append("]");
    213             return sb.ToString();
    214         }
    215         #endregion
    216     }
    217 
    218     /// <summary> 
    219     /// 取出JSON对象类 
    220     /// </summary> 
    221     public class JSONObject : Dictionary<string, object>
    222     {
    223         public new void Add(string key, object value)
    224         {
    225             System.Type t = value.GetType();
    226 
    227             if (t.Name == "String")
    228             {
    229                 value = JSONEncode.StrEncodeForDeserialize(value.ToString());
    230             }
    231 
    232             base.Add(key, value);
    233         }
    234         public override string ToString()
    235         {
    236             return JSONConvert.SerializeObject(this);
    237         }
    238         public static JSONObject FromObject(string json)
    239         {
    240             return JSONConvert.DeserializeObject(json);
    241         }
    242     }
    243 
    244     /// <summary> 
    245     /// 取出JSON数组类 
    246     /// </summary> 
    247     public class JSONArray : List<object>
    248     {
    249         public new void Add(object item)
    250         {
    251             System.Type t = item.GetType();
    252 
    253             if (t.Name == "String")
    254             {
    255                 item = JSONEncode.StrEncodeForDeserialize(item.ToString());
    256             }
    257 
    258             base.Add(item);
    259         }
    260         public override string ToString()
    261         {
    262             return JSONConvert.SerializeArray(this);
    263         }
    264         public JSONArray FromObject(string json)
    265         {
    266             return JSONConvert.DeserializeArray(json);
    267         }
    268     }
    269 
    270     /// <summary> 
    271     /// 字符串转义,将"{"、"}"、""" 
    272     /// </summary> 
    273     public class JSONEncode
    274     {
    275         public static readonly string _LEFTBRACES = "@leftbraces";//"{"转义符 
    276         public static readonly string _RIGHTBRACES = "@rightbraces";//"}"转义符 
    277         public static readonly string _LEFTBRACKETS = "@leftbrackets";//"["转义符 
    278         public static readonly string _RIGHTBRACKETS = "@rightbrackets";//"]"转义符 
    279         public static readonly string _DOUBLEQUOTATIONMARKS = "@doubleQuotationMarks";//"""转义符 
    280 
    281 
    282         #region 字符串转义
    283         /// <summary> 
    284         /// 字符串转义,将"{"、"}"、""",分别转换_LEFTBRACES、_RIGHTBRACES、_DOUBLEQUOTATIONMARKS 
    285         /// </summary> 
    286         /// <param name="text"></param> 
    287         /// <returns></returns> 
    288         public static string StrEncodeForDeserialize(string text)
    289         {
    290             return text
    291             .Replace("{", _LEFTBRACES)
    292             .Replace("}", _RIGHTBRACES)
    293             .Replace("[", _LEFTBRACKETS)
    294             .Replace("]", _RIGHTBRACKETS)
    295             .Replace("\"", _DOUBLEQUOTATIONMARKS);
    296         }
    297 
    298         /// <summary> 
    299         /// 字符串转义,将_LEFTBRACES、_RIGHTBRACES、_DOUBLEQUOTATIONMARKS,分别转换"{"、"}"、""" 
    300         /// </summary> 
    301         /// <param name="text"></param> 
    302         /// <returns></returns> 
    303         public static string StrDecodeForDeserialize(string text)
    304         {
    305             return text.Replace(_LEFTBRACES, "{")
    306             .Replace(_RIGHTBRACES, "}")
    307             .Replace(_LEFTBRACKETS, "[")
    308             .Replace(_RIGHTBRACKETS, "]")
    309             .Replace(_DOUBLEQUOTATIONMARKS, "\"");
    310         }
    311         #endregion
    312     }
    313 }

    json写完了,下面来看下使用的方法:

     1 //序列化   
     2             JSONArray jsonArray = new JSONArray();
     3             jsonArray.Add("2006");
     4             jsonArray.Add("2007");
     5             jsonArray.Add("2008");
     6             jsonArray.Add("2009");
     7             jsonArray.Add("2010");
     8 
     9             JSONObject jsonObject = new JSONObject();
    10             jsonObject.Add("domain", "mzwu.com");
    11             jsonObject.Add("years", jsonArray);
    12 
    13             Console.WriteLine(JSONConvert.SerializeObject(jsonObject));
    14             //反序列化  "{/"domain/":/"mzwu.com/",/"years/":[2006,2007,2008,2009,2010]}"   
    15             JSONObject json = JSONConvert.DeserializeObject(JSONConvert.SerializeObject(jsonObject));
    16             if (json != null)
    17             {
    18                 Console.WriteLine(json["domain"]);
    19                 Console.WriteLine(((JSONArray)json["years"])[3]);
    20             }
  • 相关阅读:
    Oracle条件分支查询
    Oracle分组函数实例
    使用JDK合成照片
    Oracle存储过程记录异常日志
    Emmet Cheat Sheet(Sublime编辑)
    JS中级
    JS中级
    架构师必须知道的架构设计原则
    JS中级
    JS中级
  • 原文地址:https://www.cnblogs.com/lyghost/p/2658191.html
Copyright © 2020-2023  润新知