.NET Json 解析到Dictionary,原生代码

2018-06-18 03:30:21来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

之前一直使用微软自带的Json,也一直想试着自己解析下Json玩玩,于是花了一个晚上的时间写了个解析的类,

 

  先说下思路,先从简单的说起:如:标准的JSon格式如:{"Key":"Value1","Key2":1,"Key3":[1,2,3,4],"Key4":{"Test1":"2"},"Key5":[{"A":1,"B":2}]}

 我是这样分的把{}的内容看成是一个完整的对象,遇到{}就把他当完整的对象解析(我表达能力可能有问题,不太会表达)

首先是读Key 严格的格式来说 Key必须带双引号,但不排除没带的  所以我做了下判断  如果有双引号 就去掉 ,然后都value值,Value值大致可分三种,

  一种就是普通的值 如:字符串、数字、时间,

  第二种是 完整的类  ,

  第三种就是数组,但数组其实也可以分为两种,一种是普通数组,一种是带子类的数组,

测试了下性能 感觉还行,就发上来了  

别吐槽哈 小弟也就这两下子

  1 #region 声明
  2 /********************************************************************************************
  3      *  CLR版本:4.0.30319.34011
  4      * .NET版本:V4.0
  5      * 类 名 称:SR 
  6      * 命名空间:DotNet
  7      * 创建时间:2014/3/9 19:19:36
  8      * 作    者:中国.NET研究协会 (网站:http://www.dotnet.org.cn  QQ群:45132984)
  9      * 识 别 号:b8f20131-829f-4db0-87a7-d62f8c5ab404
 10 ********************************************************************************************/
 11 /*****************************************本版权权*******************************************
 12  * 本软件遵照GPL协议开放源代码,您可以自由传播和修改,在遵照下面的约束条件的前提下:
 13  *      一. 只要你在每一副本上明显和恰当地出版版权声明,保持此许可证的声明和没有
 14  *          担保的声明完整无损,并和程序一起给每个其他的程序接受者一份许可证的副本,
 15  *          你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你也可以为转让
 16  *          副本的实际行动收取一定费用,但必须事先得到的同意。
 17  *      二. 你可以修改本软件的一个或几个副本或程序的任何部分,以此形成基于程序的作品。
 18  *          只要你同时满足下面的所有条件,你就可以按前面第一款的要求复制和发布这一经
 19  *          过修改的程序或作品。
 20  *      三.只要你遵循一、二条款规定,您就可以自由使用并传播本源代码,
 21  *         但必须原封不动地保留原作者信息。
 22  **********************************************************************************************/
 23 using System;
 24 using System.Collections.Generic;
 25 using System.IO;
 26 using System.Linq;
 27 using System.Text;
 28 
 29 namespace DotNet.Json
 30 {
 31     public class JsonReader
 32     {
 33         private TextReader myReader;
 34         private int EndCount = 0;
 35         Dictionary<string,object> myObjDate;
 36         private JsonReader(TextReader reader, int endCount = 0)
 37         {
 38             myObjDate = myObjDate = new Dictionary<string, object>();
 39             myReader = reader;
 40             EndCount = endCount;
 41             int intByte = ReadInt();
 42             while (EndCount != 0 && intByte != -1)
 43             {
 44                 var key = ReadKeyName(intByte);
 45                 var value = ReadValue();
 46                 myObjDate.Add(key, value);
 47                 if (EndCount == 0) { break; }
 48                 intByte = ReadInt();
 49             }
 50         }
 51         public JsonReader(TextReader reader)
 52             : this(reader, 0)
 53         { }
 54         public JsonReader(string value)
 55             : this(new StringReader(value), 0)
 56         { }
 57         private int ReadInt()
 58         {
 59             var intByte = myReader.Read();
 60             if (intByte == 123)
 61             {
 62                 EndCount++;
 63             }
 64             else if (intByte == 125)
 65             {
 66                 EndCount--;
 67             }
 68             return intByte;
 69         }
 70         private string ReadKeyName(int lastChar)
 71         {
 72             StringBuilder strBuilder = new StringBuilder();
 73             var intByte = lastChar;
 74             if (intByte == 123)
 75             {
 76                 intByte = myReader.Read();
 77             }
 78             var lastIntByte = -1;
 79             int endByteInt = -1;
 80             if (intByte == -1)
 81             {
 82                 return null;
 83             }
 84             if (intByte == 34 || intByte == 39)
 85             {
 86                 endByteInt = intByte;
 87                 intByte = myReader.Read();
 88             }
 89             while (intByte != -1)
 90             {
 91                 if (endByteInt != -1)
 92                 {
 93                     if (intByte == endByteInt && lastIntByte != 92)
 94                     {
 95                         ReadInt();
 96                         break;
 97                     }
 98                 }
 99                 else if (intByte == 58)
100                 {
101                     break;
102                 }
103 
104                 strBuilder.Append((char)intByte);
105                 intByte = myReader.Read();
106             }
107             return strBuilder.ToString();
108         }
109         private object ReadValue()
110         {
111             var intByte = myReader.Read();
112             if (intByte == 123)
113             {
114                 //函数
115                 var item = new JsonReader(myReader, 1).myObjDate;
116                 ReadInt();
117                 return item;
118             }
119             else if (intByte == 91)
120             {
121                 return ReadValueArray();
122             }
123             else
124             {
125                 return ReadValueString(intByte);
126             }
127         }
128         private string ReadValueArrayString(ref int lastChar)
129         {
130             StringBuilder strBuilder = new StringBuilder();
131             var intByte = lastChar;
132             if (intByte == 123)
133             {
134                 intByte = myReader.Read();
135             }
136             var lastIntByte = -1;
137             int endByteInt = -1;
138             if (intByte == -1)
139             {
140                 return null;
141             }
142             if (intByte == 34 || intByte == 39)
143             {
144                 endByteInt = intByte;
145                 intByte = myReader.Read();
146             }
147             while (intByte != -1)
148             {
149                 lastChar = intByte;
150                 if (endByteInt != -1)
151                 {
152                     if (intByte == endByteInt && lastIntByte != 92)
153                     {
154                         break;
155                     }
156                 }
157                 else if (intByte == 44 || (intByte == 93 && lastIntByte != 92))
158                 {
159                     break;
160                 }
161 
162                 strBuilder.Append((char)intByte);
163                 intByte = ReadInt();
164             }
165             return strBuilder.ToString();
166         }
167         private object ReadValueString(int lastChar)
168         {
169             StringBuilder strBuilder = new StringBuilder();
170             var intByte = lastChar;
171             if (intByte == 123)
172             {
173                 intByte = myReader.Read();
174             }
175             var lastIntByte = -1;
176             int endByteInt = -1;
177             if (intByte == -1)
178             {
179                 return null;
180             }
181             if (intByte == 34 || intByte == 39)
182             {
183                 endByteInt = intByte;
184                 intByte = myReader.Read();
185             }
186             while (intByte != -1)
187             {
188                 if (endByteInt != -1)
189                 {
190                     if (intByte == endByteInt && lastIntByte != 92)
191                     {
192                         ReadInt();
193                         break;
194                     }
195                 }
196                 else if (intByte == 44 || (intByte == 125 && lastIntByte != 92))
197                 {
198                     break;
199                 }
200                 strBuilder.Append((char)intByte);
201                 intByte = ReadInt();
202             }
203             return strBuilder.ToString();
204         }
205         private object[] ReadValueArray()
206         {
207             List<object> list = new List<object>();
208             var intByte = myReader.Read();
209             while (intByte != 93)
210             {
211                 if (intByte == 123)
212                 {
213                     var item = new JsonReader(myReader, 1).myObjDate;
214                     list.Add(item);
215                     if (ReadInt() == 93)
216                     {
217                         break;
218                     }
219                 }
220                 else if (intByte == 91)
221                 {
222                     list.Add(ReadValueArray());
223                 }
224                 else
225                 {
226                     list.Add(ReadValueArrayString(ref intByte));
227                     if (intByte == 93) { break; }
228                 }
229                 intByte = myReader.Read();
230             }
231             return list.ToArray();
232         }
233     }
234 }

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:点滴笔记(二):利用JS对象把值传到后台

下一篇:精品图书推荐