c#对json串的处理方法

来源:互联网 发布:淘宝淘客怎么无法打开 编辑:程序博客网 时间:2024/05/16 19:10
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
 
namespace tes
{
    public 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)
         {
             _json = new JSONObject ();
             return _json[Deserialize(text)] as JSONObject;
         }
 
         /// <summary>
         /// 序列化JSONArray对象
         /// </summary>
         /// <param name="text"></param>
         /// <returns></returns>
         public static JSONArray DeserializeArray( string text)
         {
             _json = new JSONObject ();
             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>
     /// 取出JSON对象类
     /// </summary>
     public class JSONObject : Dictionary<string , object>
     {
         public new void Add( string key, object value)
         {
             System. Type t = value.GetType();
 
             if (t.Name == "String" )
             {
                 value = JSONEncode.StrEncodeForDeserialize(value.ToString());
             }
 
             base.Add(key, value);
         }
         public override string ToString()
         {
             return JSONConvert .SerializeObject(this);
         }
         public static JSONObject FromObject( string json)
         {
             return JSONConvert .DeserializeObject(json);
         }
     }
 
     /// <summary>
     /// 取出JSON数组类
     /// </summary>
     public class JSONArray : List<object >
     {
         public new void Add( object item)
         {
             System. Type t = item.GetType();
 
             if (t.Name == "String" )
             {
                 item = JSONEncode.StrEncodeForDeserialize(item.ToString());
             }
 
             base.Add(item);
         }
         public override string ToString()
         {
             return JSONConvert .SerializeArray(this);
         }
         public JSONArray FromObject(string json)
         {
             return JSONConvert .DeserializeArray(json);
         }
     }
 
    /// <summary>
     /// 字符串转义,将"{"、"}"、"""
     /// </summary>
     public class JSONEncode
     {
         public static readonly string _LEFTBRACES = "@leftbraces" ;//"{"转义符
         public static readonly string _RIGHTBRACES = "@rightbraces" ;//"}"转义符
         public static readonly string _LEFTBRACKETS = "@leftbrackets" ;//"["转义符
         public static readonly string _RIGHTBRACKETS = "@rightbrackets" ;//"]"转义符
         public static readonly string _DOUBLEQUOTATIONMARKS = "@doubleQuotationMarks" ;//"""转义符
 
 
         #region 字符串转义
         /// <summary>
         /// 字符串转义,将"{"、"}"、""",分别转换_LEFTBRACES、_RIGHTBRACES、_DOUBLEQUOTATIONMARKS
         /// </summary>
         /// <param name="text"></param>
         /// <returns></returns>
         public static string StrEncodeForDeserialize( string text)
         {
             return text
             .Replace( "{", _LEFTBRACES)
             .Replace( "}", _RIGHTBRACES)
             .Replace( "[", _LEFTBRACKETS)
             .Replace( "]", _RIGHTBRACKETS)
             .Replace( "\"", _DOUBLEQUOTATIONMARKS);
         }
 
         /// <summary>
         /// 字符串转义,将_LEFTBRACES、_RIGHTBRACES、_DOUBLEQUOTATIONMARKS,分别转换"{"、"}"、"""
         /// </summary>
         /// <param name="text"></param>
         /// <returns></returns>
         public static string StrDecodeForDeserialize( string text)
         {
             return text.Replace(_LEFTBRACES, "{" )
             .Replace(_RIGHTBRACES, "}")
             .Replace(_LEFTBRACKETS, "[")
             .Replace(_RIGHTBRACKETS, "]")
             .Replace(_DOUBLEQUOTATIONMARKS, "\"");
         }
         #endregion
    }
}
 
 
 
 
------------------------------------------------------------------------
读取之后调用相关方法处理
 
string contents = reader.ReadToEnd();
            string str1 = contents;
            str1 = str1.Replace( " ", "" );
            str1 = str1.Replace( "[]", "[ ]" );
            str1 = str1.Replace( "\"\"", "\" \"" );
 
 
JSONObject json = JSONConvert .DeserializeObject(str1);
            string str2 = ((JSONArray )json["jokes"])[0].ToString();
            JSONObject json1 = JSONConvert .DeserializeObject(str2);
            string str3 = json1["content" ].ToString();
            string str4 = unicodetogb(str3); 
            Dispatcher.BeginInvoke(() => { textBox1.Text = str4; }); //特别注意需要通过Dispatcher去更新UI进程
 
  
原创粉丝点击