c#对json串的处理方法

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进程
 
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值