欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# JsonHelper 操作輔助類(lèi),拿來(lái)直接用

 更新時(shí)間:2016年05月07日 18:08:39   作者:果凍布丁喜之郎  
本文總結(jié)了一些常用的JSON操作輔助類(lèi),包括轉(zhuǎn)換、判斷、Ajax異步等操作,希望能幫到大家。

四個(gè)主要操作類(lèi):JsonConverter 、JsonHelper 、JsonSplit 、AjaxResult

一、JsonConverter:

自定義查詢(xún)對(duì)象轉(zhuǎn)換動(dòng)態(tài)類(lèi)、object動(dòng)態(tài)類(lèi)轉(zhuǎn)換json包、json轉(zhuǎn)換object動(dòng)態(tài)類(lèi)、DataReader轉(zhuǎn)換為Json、DataSet轉(zhuǎn)換為Json、DataTable轉(zhuǎn)成Json、Datatable轉(zhuǎn)換為Json 、格式化字符型日期型布爾型、過(guò)濾特殊字符等

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using System.Web.Script.Serialization;
using System.Collections;

namespace Common
{
  public class JsonConverter
  {
    
    /// <summary>
    /// 自定義查詢(xún)對(duì)象轉(zhuǎn)換動(dòng)態(tài)類(lèi)
    /// add yuangang by 2015-05-19
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static dynamic JsonClass(object obj) 
    {
      return ConvertJson(Serialize(obj, true));
    }

    /// <summary>
    /// object動(dòng)態(tài)類(lèi)轉(zhuǎn)換json包
    /// add yuangang by 2015-05-19
    /// </summary>
    /// <param name="obj">對(duì)象</param>
    /// <param name="DateConvert">時(shí)間戳是否轉(zhuǎn)換成日期類(lèi)型</param>
    /// <returns></returns>
    public static string Serialize(object obj, bool DateConvert = false)
    {
      JavaScriptSerializer jss = new JavaScriptSerializer();
      var str = jss.Serialize(obj);
      if (DateConvert)
      {
        str = System.Text.RegularExpressions.Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
        {
          DateTime dt = new DateTime(1970, 1, 1);
          dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
          dt = dt.ToLocalTime();
          return dt.ToString("yyyy-MM-dd HH:mm:ss");
        });
      }
      return str;
    }

    /// <summary>
    /// json轉(zhuǎn)換object動(dòng)態(tài)類(lèi)
    /// add yuangang by 2015-05-19
    /// </summary>
    /// <param name="json"></param>
    /// <returns></returns>
    public static dynamic ConvertJson(string json)
    {
      JavaScriptSerializer jss = new JavaScriptSerializer();
      jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });
      dynamic dy = jss.Deserialize(json, typeof(object)) as dynamic;
      return dy;
    }

    /// <summary>  
    /// DataReader轉(zhuǎn)換為Json  
    /// </summary>  
    /// <param name="dataReader">DataReader對(duì)象</param>  
    /// <returns>Json字符串</returns>  
    public static string ToJson(IDataReader dataReader)
    {
      try
      {
        StringBuilder jsonString = new StringBuilder();
        jsonString.Append("[");

        while (dataReader.Read())
        {
          jsonString.Append("{");
          for (int i = 0; i < dataReader.FieldCount; i++)
          {
            Type type = dataReader.GetFieldType(i);
            string strKey = dataReader.GetName(i);
            string strValue = dataReader[i].ToString();
            jsonString.Append("\"" + strKey + "\":");
            strValue = StringFormat(strValue, type);
            if (i < dataReader.FieldCount - 1)
            {
              jsonString.Append(strValue + ",");
            }
            else
            {
              jsonString.Append(strValue);
            }
          }
          jsonString.Append("},");
        }
        if (!dataReader.IsClosed)
        {
          dataReader.Close();
        }
        jsonString.Remove(jsonString.Length - 1, 1);
        jsonString.Append("]");
        if (jsonString.Length == 1)
        {
          return "[]";
        }
        return jsonString.ToString();
      }
      catch (Exception ex)
      {
        throw ex;
      }
    }

    /// <summary>  
    /// DataSet轉(zhuǎn)換為Json  
    /// add yuangang by 2015-05-19
    /// </summary>  
    /// <param name="dataSet">DataSet對(duì)象</param>  
    /// <returns>Json字符串</returns>  
    public static string ToJson(DataSet dataSet)
    {
      string jsonString = "{";
      foreach (DataTable table in dataSet.Tables)
      {
        jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";
      }
      jsonString = jsonString.TrimEnd(',');
      return jsonString + "}";
    }
    /// <summary> 
    /// DataTable轉(zhuǎn)成Json  
    /// add yuangang by 2015-05-19
    /// </summary> 
    /// <param name="jsonName"></param> 
    /// <param name="dt"></param> 
    /// <returns></returns> 
    public static string ToJson(DataTable dt, string jsonName)
    {
      StringBuilder Json = new StringBuilder();
      if (string.IsNullOrEmpty(jsonName))
        jsonName = dt.TableName;
      Json.Append("{\"" + jsonName + "\":[");
      if (dt.Rows.Count > 0)
      {
        for (int i = 0; i < dt.Rows.Count; i++)
        {
          Json.Append("{");
          for (int j = 0; j < dt.Columns.Count; j++)
          {
            Type type = dt.Rows[i][j].GetType();
            Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j] is DBNull ? string.Empty : dt.Rows[i][j].ToString(), type));
            if (j < dt.Columns.Count - 1)
            {
              Json.Append(",");
            }
          }
          Json.Append("}");
          if (i < dt.Rows.Count - 1)
          {
            Json.Append(",");
          }
        }
      }
      Json.Append("]}");
      return Json.ToString();
    }
    /// <summary>  
    /// Datatable轉(zhuǎn)換為Json  
    /// add yuangang by 2015-05-19
    /// </summary>  
    /// <param name="table">Datatable對(duì)象</param>  
    /// <returns>Json字符串</returns>  
    public static string ToJson(DataTable dt)
    {
      StringBuilder jsonString = new StringBuilder();
      jsonString.Append("[");
      DataRowCollection drc = dt.Rows;
      for (int i = 0; i < drc.Count; i++)
      {
        jsonString.Append("{");
        for (int j = 0; j < dt.Columns.Count; j++)
        {
          string strKey = dt.Columns[j].ColumnName;
          string strValue = drc[i][j].ToString();
          Type type = dt.Columns[j].DataType;
          jsonString.Append("\"" + strKey + "\":");
          strValue = StringFormat(strValue, type);
          if (j < dt.Columns.Count - 1)
          {
            jsonString.Append(strValue + ",");
          }
          else
          {
            jsonString.Append(strValue);
          }
        }
        jsonString.Append("},");
      }
      jsonString.Remove(jsonString.Length - 1, 1);
      jsonString.Append("]");
      if (jsonString.Length == 1)
      {
        return "[]";
      }
      return jsonString.ToString();
    } 
    /// <summary> 
    /// 格式化字符型、日期型、布爾型 
    /// add yuangang by 2015-05-19
    /// </summary> 
    /// <param name="str"></param> 
    /// <param name="type"></param> 
    /// <returns></returns> 
    private static string StringFormat(string str, Type type)
    {
      if (type != typeof(string) && string.IsNullOrEmpty(str))
      {
        str = "\"" + str + "\"";
      }
      else if (type == typeof(string))
      {
        str = String2Json(str);
        str = "\"" + str + "\"";
      }
      else if (type == typeof(DateTime))
      {
        str = "\"" + str + "\"";
      }
      else if (type == typeof(bool))
      {
        str = str.ToLower();
      }
      else if (type == typeof(byte[]))
      {
        str = "\"" + str + "\"";
      }
      else if (type == typeof(Guid))
      {
        str = "\"" + str + "\"";
      }
      return str;
    }
    /// <summary> 
    /// 過(guò)濾特殊字符 
    /// add yuangang by 2015-05-19
    /// </summary> 
    /// <param name="s"></param> 
    /// <returns></returns> 
    public static string String2Json(String s)
    {
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < s.Length; i++)
      {
        char c = s.ToCharArray()[i];
        switch (c)
        {
          case '\"':
            sb.Append("\\\""); break;
          case '\\':
            sb.Append("\\\\"); break;
          case '/':
            sb.Append("\\/"); break;
          case '\b':
            sb.Append("\\b"); break;
          case '\f':
            sb.Append("\\f"); break;
          case '\n':
            sb.Append("\\n"); break;
          case '\r':
            sb.Append("\\r"); break;
          case '\t':
            sb.Append("\\t"); break;
          case '\v':
            sb.Append("\\v"); break;
          case '\0':
            sb.Append("\\0"); break;
          default:
            sb.Append(c); break;
        }
      }
      return sb.ToString();
    }

    public static string GetDataGridJsonByDataSet(DataSet ds, string totalProperty, string root)
    {
      return GetDataGridJsonByDataTable(ds.Tables[0], totalProperty, root);
    }
    public static string GetDataGridJsonByDataTable(DataTable dt, string totalProperty, string root)
    {
      StringBuilder jsonBuilder = new StringBuilder();
      jsonBuilder.Append("({\"" + totalProperty + "\":\"" + dt.Rows.Count + "\",");
      jsonBuilder.Append("\"");
      jsonBuilder.Append(root);
      jsonBuilder.Append("\":[");
      for (int i = 0; i < dt.Rows.Count; i++)
      {
        jsonBuilder.Append("{");
        for (int j = 0; j < dt.Columns.Count; j++)
        {
          jsonBuilder.Append("\"");
          jsonBuilder.Append(dt.Columns[j].ColumnName);
          jsonBuilder.Append("\":\"");
          jsonBuilder.Append(dt.Rows[i][j].ToString());
          jsonBuilder.Append("\",");
        }
        jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
        jsonBuilder.Append("},");
      }
      jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
      jsonBuilder.Append("]");
      jsonBuilder.Append("})");
      return jsonBuilder.ToString();
    }

    public static string GetTreeJsonByDataSet(DataSet ds)
    {
      return GetTreeJsonByDataTable(ds.Tables[0]);
    }
    public static string GetTreeJsonByDataTable(DataTable dataTable)
    {
      DataTable dt = FormatDataTableForTree(dataTable);
      StringBuilder jsonBuilder = new StringBuilder();
      jsonBuilder.Append("[");
      for (int i = 0; i < dt.Rows.Count; i++)
      {
        jsonBuilder.Append("{");
        for (int j = 0; j < dt.Columns.Count; j++)
        {
          jsonBuilder.Append("\'");

          if (dt.Columns[j].ColumnName == "leaf")
          {
            string leafValue = dt.Rows[i][j].ToString();

            if (!string.IsNullOrEmpty(leafValue))
            {
              jsonBuilder.Append(dt.Columns[j].ColumnName);
              jsonBuilder.Append("\':\'");
              jsonBuilder.Append(dt.Rows[i][j].ToString());
              jsonBuilder.Append("\',");
            }
            else
            {
              jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            }
          }
          else if (dt.Columns[j].ColumnName == "customUrl")
          {
            jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            jsonBuilder.Append(dt.Columns[j].ColumnName);
            jsonBuilder.Append(":\'");
            jsonBuilder.Append(dt.Rows[i][j].ToString());
            jsonBuilder.Append("\',");
          }
          else
          {
            jsonBuilder.Append(dt.Columns[j].ColumnName);
            jsonBuilder.Append("\':\'");
            jsonBuilder.Append(dt.Rows[i][j].ToString());
            jsonBuilder.Append("\',");
          }

        }
        jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
        jsonBuilder.Append("},");
      }
      jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
      jsonBuilder.Append("]");
      return jsonBuilder.ToString();
    }
    private static DataTable FormatDataTableForTree(DataTable dt)
    {
      DataTable dtTree = new DataTable();
      dtTree.Columns.Add("id", typeof(string));
      dtTree.Columns.Add("text", typeof(string));
      dtTree.Columns.Add("leaf", typeof(string));
      dtTree.Columns.Add("cls", typeof(string));
      dtTree.Columns.Add("customUrl", typeof(string));
      dtTree.AcceptChanges();

      for (int i = 0; i < dt.Rows.Count; i++)
      {
        DataRow drTree = dtTree.NewRow();
        drTree["id"] = dt.Rows[i]["id"].ToString();
        drTree["text"] = dt.Rows[i]["text"].ToString();
        if (dt.Rows[i]["leaf"].ToString() == "Y")
        {
          drTree["leaf"] = "true";
          drTree["cls"] = "file";
        }
        else
        {
          drTree["cls"] = "folder";
        }
        drTree["customUrl"] = dt.Rows[i]["customUrl"].ToString();
        dtTree.Rows.Add(drTree);
      }
      return dtTree;
    }
 
  }
  /// <summary>
  /// 動(dòng)態(tài)JSON解析
  /// add yuangang by 2015-05-19
  /// </summary>
  public class DynamicJsonObject : System.Dynamic.DynamicObject
  {
    private IDictionary<string, object> Dictionary { get; set; }

    public DynamicJsonObject(IDictionary<string, object> dictionary)
    {
      this.Dictionary = dictionary;
    }

    public override bool TryGetMember(System.Dynamic.GetMemberBinder binder, out object result)
    {
      result = this.Dictionary[binder.Name];

      if (result is IDictionary<string, object>)
      {
        result = new DynamicJsonObject(result as IDictionary<string, object>);
      }
      else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
      {
        result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
      }
      else if (result is ArrayList)
      {
        result = new List<object>((result as ArrayList).ToArray());
      }

      return this.Dictionary.ContainsKey(binder.Name);
    }
  }
  /// <summary>
  /// 動(dòng)態(tài)JSON轉(zhuǎn)換
  /// add yuangang by 2015-05-19
  /// </summary>
  public class DynamicJsonConverter : JavaScriptConverter
  {
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
      if (dictionary == null)
        throw new ArgumentNullException("dictionary");

      if (type == typeof(object))
      {
        return new DynamicJsonObject(dictionary);
      }

      return null;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
      throw new NotImplementedException();
    }

    public override IEnumerable<Type> SupportedTypes
    {
      get { return new System.Collections.ObjectModel.ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(object) })); }
    }
  }
}

二、JsonHelper:json的輔助類(lèi)

using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.Runtime.Serialization.Json;
using System.IO;

namespace Common
{

  /// <summary>
  /// 提供了一個(gè)關(guān)于json的輔助類(lèi)
  /// </summary>
  public class JsonHelper
  {
    #region Method
    /// <summary>
    /// 類(lèi)對(duì)像轉(zhuǎn)換成json格式
    /// </summary> 
    /// <returns></returns>
    public static string ToJson(object t)
    {
     return JsonConvert.SerializeObject(t, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include });
    }
    /// <summary>
    /// 類(lèi)對(duì)像轉(zhuǎn)換成json格式
    /// </summary>
    /// <param name="t"></param>
    /// <param name="HasNullIgnore">是否忽略NULL值</param>
    /// <returns></returns>
    public static string ToJson(object t, bool HasNullIgnore)
    {
      if (HasNullIgnore)
        return JsonConvert.SerializeObject(t, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
      else
        return ToJson(t);
    }
    /// <summary>
    /// json格式轉(zhuǎn)換
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="strJson"></param>
    /// <returns></returns>
    public static T FromJson<T>(string strJson) where T : class
    {
      if (!strJson.IsNullOrEmpty())
        return JsonConvert.DeserializeObject<T>(strJson);
      return null;
    }
    /// <summary>
    /// 功能描述:將List轉(zhuǎn)換為Json
    /// </summary>
    /// <param name="a"></param>
    /// <returns></returns>
    public static string ListToJson(IList<object> a)
    {

      DataContractJsonSerializer json = new DataContractJsonSerializer(a.GetType());
      string szJson = "";
      //序列化
      using (MemoryStream stream = new MemoryStream())
      {
        json.WriteObject(stream, a);
        szJson = Encoding.UTF8.GetString(stream.ToArray());
      }
      return szJson;
    }
    #endregion

    #region Property
    /// <summary>
    /// 數(shù)據(jù)狀態(tài)
    /// </summary>
    public string Status { get; set; }
    /// <summary>
    /// 提示信息
    /// </summary>
    public string Msg { get; set; }
    /// <summary>
    /// 回傳URL
    /// </summary>
    public string ReUrl { get; set; }
    /// <summary>
    /// 數(shù)據(jù)包
    /// </summary>
    public object Data { get; set; }
    #endregion

  }
}

三、JsonSplit:判斷字符串是否為Json

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Common
{
  /// <summary>
  /// 判斷字符串是否為JSON
  /// </summary>
  public class JsonSplit
  {
    private static bool IsJsonStart(ref string json)
    {
      if (!string.IsNullOrEmpty(json))
      {
        json = json.Trim('\r', '\n', ' ');
        if (json.Length > 1)
        {
          char s = json[0];
          char e = json[json.Length - 1];
          return (s == '{' && e == '}') || (s == '[' && e == ']');
        }
      }
      return false;
    }
    public static bool IsJson(string json)
    {
      int errIndex;
      return IsJson(json, out errIndex);
    }
    public static bool IsJson(string json, out int errIndex)
    {
      errIndex = 0;
      if (IsJsonStart(ref json))
      {
        CharState cs = new CharState();
        char c;
        for (int i = 0; i < json.Length; i++)
        {
          c = json[i];
          if (SetCharState(c, ref cs) && cs.childrenStart)//設(shè)置關(guān)鍵符號(hào)狀態(tài)。
          {
            string item = json.Substring(i);
            int err;
            int length = GetValueLength(item, true, out err);
            cs.childrenStart = false;
            if (err > 0)
            {
              errIndex = i + err;
              return false;
            }
            i = i + length - 1;
          }
          if (cs.isError)
          {
            errIndex = i;
            return false;
          }
        }

        return !cs.arrayStart && !cs.jsonStart;
      }
      return false;
    }

    /// <summary>
    /// 獲取值的長(zhǎng)度(當(dāng)Json值嵌套以"{"或"["開(kāi)頭時(shí))
    /// </summary>
    private static int GetValueLength(string json, bool breakOnErr, out int errIndex)
    {
      errIndex = 0;
      int len = 0;
      if (!string.IsNullOrEmpty(json))
      {
        CharState cs = new CharState();
        char c;
        for (int i = 0; i < json.Length; i++)
        {
          c = json[i];
          if (!SetCharState(c, ref cs))//設(shè)置關(guān)鍵符號(hào)狀態(tài)。
          {
            if (!cs.jsonStart && !cs.arrayStart)//json結(jié)束,又不是數(shù)組,則退出。
            {
              break;
            }
          }
          else if (cs.childrenStart)//正常字符,值狀態(tài)下。
          {
            int length = GetValueLength(json.Substring(i), breakOnErr, out errIndex);//遞歸子值,返回一個(gè)長(zhǎng)度。。。
            cs.childrenStart = false;
            cs.valueStart = 0;
            //cs.state = 0;
            i = i + length - 1;
          }
          if (breakOnErr && cs.isError)
          {
            errIndex = i;
            return i;
          }
          if (!cs.jsonStart && !cs.arrayStart)//記錄當(dāng)前結(jié)束位置。
          {
            len = i + 1;//長(zhǎng)度比索引+1
            break;
          }
        }
      }
      return len;
    }
    /// <summary>
    /// 字符狀態(tài)
    /// </summary>
    private class CharState
    {
      internal bool jsonStart = false;//以 "{"開(kāi)始了...
      internal bool setDicValue = false;// 可以設(shè)置字典值了。
      internal bool escapeChar = false;//以"\"轉(zhuǎn)義符號(hào)開(kāi)始了
      /// <summary>
      /// 數(shù)組開(kāi)始【僅第一開(kāi)頭才算】,值嵌套的以【childrenStart】來(lái)標(biāo)識(shí)。
      /// </summary>
      internal bool arrayStart = false;//以"[" 符號(hào)開(kāi)始了
      internal bool childrenStart = false;//子級(jí)嵌套開(kāi)始了。
      /// <summary>
      /// 【0 初始狀態(tài),或 遇到“,”逗號(hào)】;【1 遇到“:”冒號(hào)】
      /// </summary>
      internal int state = 0;

      /// <summary>
      /// 【-1 取值結(jié)束】【0 未開(kāi)始】【1 無(wú)引號(hào)開(kāi)始】【2 單引號(hào)開(kāi)始】【3 雙引號(hào)開(kāi)始】
      /// </summary>
      internal int keyStart = 0;
      /// <summary>
      /// 【-1 取值結(jié)束】【0 未開(kāi)始】【1 無(wú)引號(hào)開(kāi)始】【2 單引號(hào)開(kāi)始】【3 雙引號(hào)開(kāi)始】
      /// </summary>
      internal int valueStart = 0;
      internal bool isError = false;//是否語(yǔ)法錯(cuò)誤。

      internal void CheckIsError(char c)//只當(dāng)成一級(jí)處理(因?yàn)镚etLength會(huì)遞歸到每一個(gè)子項(xiàng)處理)
      {
        if (keyStart > 1 || valueStart > 1)
        {
          return;
        }
        //示例 ["aa",{"bbbb":123,"fff","ddd"}] 
        switch (c)
        {
          case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]
            isError = jsonStart && state == 0;//重復(fù)開(kāi)始錯(cuò)誤 同時(shí)不是值處理。
            break;
          case '}':
            isError = !jsonStart || (keyStart != 0 && state == 0);//重復(fù)結(jié)束錯(cuò)誤 或者 提前結(jié)束{"aa"}。正常的有{}
            break;
          case '[':
            isError = arrayStart && state == 0;//重復(fù)開(kāi)始錯(cuò)誤
            break;
          case ']':
            isError = !arrayStart || jsonStart;//重復(fù)開(kāi)始錯(cuò)誤 或者 Json 未結(jié)束
            break;
          case '"':
          case '\'':
            isError = !(jsonStart || arrayStart); //json 或數(shù)組開(kāi)始。
            if (!isError)
            {
              //重復(fù)開(kāi)始 [""",{"" "}]
              isError = (state == 0 && keyStart == -1) || (state == 1 && valueStart == -1);
            }
            if (!isError && arrayStart && !jsonStart && c == '\'')//['aa',{}]
            {
              isError = true;
            }
            break;
          case ':':
            isError = !jsonStart || state == 1;//重復(fù)出現(xiàn)。
            break;
          case ',':
            isError = !(jsonStart || arrayStart); //json 或數(shù)組開(kāi)始。
            if (!isError)
            {
              if (jsonStart)
              {
                isError = state == 0 || (state == 1 && valueStart > 1);//重復(fù)出現(xiàn)。
              }
              else if (arrayStart)//["aa,] [,] [{},{}]
              {
                isError = keyStart == 0 && !setDicValue;
              }
            }
            break;
          case ' ':
          case '\r':
          case '\n'://[ "a",\r\n{} ]
          case '\0':
          case '\t':
            break;
          default: //值開(kāi)頭。。
            isError = (!jsonStart && !arrayStart) || (state == 0 && keyStart == -1) || (valueStart == -1 && state == 1);//
            break;
        }
        //if (isError)
        //{

        //}
      }
    }
    /// <summary>
    /// 設(shè)置字符狀態(tài)(返回true則為關(guān)鍵詞,返回false則當(dāng)為普通字符處理)
    /// </summary>
    private static bool SetCharState(char c, ref CharState cs)
    {
      cs.CheckIsError(c);
      switch (c)
      {
        case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]
          #region 大括號(hào)
          if (cs.keyStart <= 0 && cs.valueStart <= 0)
          {
            cs.keyStart = 0;
            cs.valueStart = 0;
            if (cs.jsonStart && cs.state == 1)
            {
              cs.childrenStart = true;
            }
            else
            {
              cs.state = 0;
            }
            cs.jsonStart = true;//開(kāi)始。
            return true;
          }
          #endregion
          break;
        case '}':
          #region 大括號(hào)結(jié)束
          if (cs.keyStart <= 0 && cs.valueStart < 2 && cs.jsonStart)
          {
            cs.jsonStart = false;//正常結(jié)束。
            cs.state = 0;
            cs.keyStart = 0;
            cs.valueStart = 0;
            cs.setDicValue = true;
            return true;
          }
          // cs.isError = !cs.jsonStart && cs.state == 0;
          #endregion
          break;
        case '[':
          #region 中括號(hào)開(kāi)始
          if (!cs.jsonStart)
          {
            cs.arrayStart = true;
            return true;
          }
          else if (cs.jsonStart && cs.state == 1)
          {
            cs.childrenStart = true;
            return true;
          }
          #endregion
          break;
        case ']':
          #region 中括號(hào)結(jié)束
          if (cs.arrayStart && !cs.jsonStart && cs.keyStart <= 2 && cs.valueStart <= 0)//[{},333]//這樣結(jié)束。
          {
            cs.keyStart = 0;
            cs.valueStart = 0;
            cs.arrayStart = false;
            return true;
          }
          #endregion
          break;
        case '"':
        case '\'':
          #region 引號(hào)
          if (cs.jsonStart || cs.arrayStart)
          {
            if (cs.state == 0)//key階段,有可能是數(shù)組["aa",{}]
            {
              if (cs.keyStart <= 0)
              {
                cs.keyStart = (c == '"' ? 3 : 2);
                return true;
              }
              else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"'))
              {
                if (!cs.escapeChar)
                {
                  cs.keyStart = -1;
                  return true;
                }
                else
                {
                  cs.escapeChar = false;
                }
              }
            }
            else if (cs.state == 1 && cs.jsonStart)//值階段必須是Json開(kāi)始了。
            {
              if (cs.valueStart <= 0)
              {
                cs.valueStart = (c == '"' ? 3 : 2);
                return true;
              }
              else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"'))
              {
                if (!cs.escapeChar)
                {
                  cs.valueStart = -1;
                  return true;
                }
                else
                {
                  cs.escapeChar = false;
                }
              }

            }
          }
          #endregion
          break;
        case ':':
          #region 冒號(hào)
          if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0)
          {
            if (cs.keyStart == 1)
            {
              cs.keyStart = -1;
            }
            cs.state = 1;
            return true;
          }
          // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1);
          #endregion
          break;
        case ',':
          #region 逗號(hào) //["aa",{aa:12,}]

          if (cs.jsonStart)
          {
            if (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1)
            {
              cs.state = 0;
              cs.keyStart = 0;
              cs.valueStart = 0;
              //if (cs.valueStart == 1)
              //{
              //  cs.valueStart = 0;
              //}
              cs.setDicValue = true;
              return true;
            }
          }
          else if (cs.arrayStart && cs.keyStart <= 2)
          {
            cs.keyStart = 0;
            //if (cs.keyStart == 1)
            //{
            //  cs.keyStart = -1;
            //}
            return true;
          }
          #endregion
          break;
        case ' ':
        case '\r':
        case '\n'://[ "a",\r\n{} ]
        case '\0':
        case '\t':
          if (cs.keyStart <= 0 && cs.valueStart <= 0) //cs.jsonStart && 
          {
            return true;//跳過(guò)空格。
          }
          break;
        default: //值開(kāi)頭。。
          if (c == '\\') //轉(zhuǎn)義符號(hào)
          {
            if (cs.escapeChar)
            {
              cs.escapeChar = false;
            }
            else
            {
              cs.escapeChar = true;
              return true;
            }
          }
          else
          {
            cs.escapeChar = false;
          }
          if (cs.jsonStart || cs.arrayStart) // Json 或數(shù)組開(kāi)始了。
          {
            if (cs.keyStart <= 0 && cs.state == 0)
            {
              cs.keyStart = 1;//無(wú)引號(hào)的
            }
            else if (cs.valueStart <= 0 && cs.state == 1 && cs.jsonStart)//只有Json開(kāi)始才有值。
            {
              cs.valueStart = 1;//無(wú)引號(hào)的
            }
          }
          break;
      }
      return false;
    }
  }
}

四、AjaxResult:前臺(tái)Ajax請(qǐng)求的統(tǒng)一返回結(jié)果類(lèi)

using System.Web.Script.Serialization;
namespace Common
{
  /// <summary>
  /// 前臺(tái)Ajax請(qǐng)求的統(tǒng)一返回結(jié)果類(lèi)
  /// </summary>
  public class AjaxResult
  {
    private AjaxResult()
    {
    }

    private bool iserror = false;

    /// <summary>
    /// 是否產(chǎn)生錯(cuò)誤
    /// </summary>
    public bool IsError { get { return iserror; } }

    /// <summary>
    /// 錯(cuò)誤信息,或者成功信息
    /// </summary>
    public string Message { get; set; }

    /// <summary>
    /// 成功可能時(shí)返回的數(shù)據(jù)
    /// </summary>
    public object Data { get; set; }

    #region Error
    public static AjaxResult Error()
    {
      return new AjaxResult()
      {
        iserror = true
      };
    }
    public static AjaxResult Error(string message)
    {
      return new AjaxResult()
      {
        iserror = true,
        Message = message
      };
    }
    #endregion

    #region Success
    public static AjaxResult Success()
    {
      return new AjaxResult()
      {
        iserror = false
      };
    }
    public static AjaxResult Success(string message)
    {
      return new AjaxResult()
      {
        iserror = false,
        Message = message
      };
    }
    public static AjaxResult Success(object data)
    {
      return new AjaxResult()
      {
        iserror = false,
        Data = data
      };
    }
    public static AjaxResult Success(object data, string message)
    {
      return new AjaxResult()
      {
        iserror = false,
        Data = data,
        Message = message
      };
    }
    #endregion

    /// <summary>
    /// 序列化
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
      return new JavaScriptSerializer().Serialize(this);
    }
  }
}

常用的一些Json操作類(lèi),留著備用,需要的朋友的直接拿去用吧。

相關(guān)文章

  • C#幾種排序算法

    C#幾種排序算法

    C#幾種排序算法...
    2007-03-03
  • 用 C# Winform做出全透明的磨砂玻璃窗體效果代碼

    用 C# Winform做出全透明的磨砂玻璃窗體效果代碼

    就是一個(gè)簡(jiǎn)單的例子, 調(diào)用系統(tǒng)的 dwm 去重繪窗口. 只能在 Vista 和 7 之后才可以, 并且要確保已經(jīng)開(kāi)啟主題服務(wù)等等, 總之不是非常實(shí)用, 好玩而已
    2011-05-05
  • C#實(shí)現(xiàn)六大設(shè)計(jì)原則之接口隔離原則

    C#實(shí)現(xiàn)六大設(shè)計(jì)原則之接口隔離原則

    這篇文章介紹了C#實(shí)現(xiàn)六大設(shè)計(jì)原則之接口隔離原則的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C# wpf解決Popup彈出位置異常問(wèn)題解決

    C# wpf解決Popup彈出位置異常問(wèn)題解決

    本文主要介紹了C# wpf解決Popup彈出位置異常問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Winform下實(shí)現(xiàn)圖片切換特效的方法

    Winform下實(shí)現(xiàn)圖片切換特效的方法

    這篇文章主要介紹了Winform下實(shí)現(xiàn)圖片切換特效的方法,包括百葉窗、淡入、旋轉(zhuǎn)等多種效果,需要的朋友可以參考下
    2014-08-08
  • C#中try...catch的使用與常見(jiàn)面試題分享

    C#中try...catch的使用與常見(jiàn)面試題分享

    這篇文章首先給大家介紹了關(guān)于C#中try...catch的語(yǔ)法,而后又給大家分享了關(guān)于C#中try...catch最常見(jiàn)的面試題,具有一定的參考借鑒價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-02-02
  • C#實(shí)現(xiàn)會(huì)移動(dòng)的文字效果

    C#實(shí)現(xiàn)會(huì)移動(dòng)的文字效果

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)會(huì)移動(dòng)的文字效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C#8.0中的模式匹配

    C#8.0中的模式匹配

    這篇文章介紹了C#8.0中的模式匹配,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)示例詳解

    C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)示例詳解

    這篇文章主要給大家介紹了關(guān)于C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • C# 獲取硬件參數(shù)的實(shí)現(xiàn)方法

    C# 獲取硬件參數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C# 獲取硬件參數(shù)的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10

最新評(píng)論