亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談C#手動解析Json格式內容

2019-11-17 02:47:19
字體:
來源:轉載
供稿:網友

淺談C#手動解析Json格式內容

這個應該算處女貼吧 - -

經過一位博友的點撥以下代碼不包含轉義的驗證 還需各位自己添加在此不作修改 至于完善后的生成文件參見下一篇《C#深入解析Json格式內容》

之前百度了許久基本沒有一個滿意的json結構的解析類庫 想了想還是自己做一個吧

現在我來說下大概的思路 首先我創建了一個JsonTokener的類 用于處理json字符串的一些操作里面有個枚舉

 1     public enum JsonCharType 2     { 3         BeginObject = 123, //{ 4         EndObject = 125, //} 5         BeginArray = 91, //[ 6         EndArray = 93, //] 7         DoubleQuote = 34, //" 8         SingleQuote = 39, //' 9         Comma = 44,//,10         Split = 58, //:11         Slash = 92, ///12         BackSlash = 47, ///13         Right = 13, ///r14         Line = 10, ///n15         None = -1 //結尾或異常16     }

這些枚舉數值代表了循環到的char狀態 后面都有注釋說明每個值代表的字符

  1  public sealed class JsonTokener  2     {  3         PRivate string jsonSource = string.Empty;  4         private int currentIndex = -1;  5   6         public int CurrentIndex  7         {  8             get { return currentIndex; }  9             set { currentIndex = value; } 10         } 11         private int countIndex = 0; 12  13         internal int lastIndex = 0; 14  15         public JsonTokener(string jsonSource) 16         { 17             this.jsonSource = jsonSource; 18             currentIndex = -1; 19             countIndex = jsonSource != null ? jsonSource.Length : 0; 20         } 21  22         /// <summary> 23         /// 向前推進一個字符 24         /// </summary> 25         /// <returns></returns> 26         public JsonCharType next() 27         { 28             currentIndex++; 29             return getCurrentIndex(); 30         } 31  32         public JsonCharType next(params JsonCharType[] types) 33         { 34             JsonCharType currentType = next(); 35             while ((int)currentType != -1) 36             { 37                 if (checkType(currentType, types)) 38                 { 39                     return currentType; 40                 } 41                 else 42                 { 43                     currentType = next(); 44                 } 45             } 46             return JsonCharType.None; 47         } 48  49         private bool checkType(JsonCharType currentType, JsonCharType[] types) 50         { 51             foreach (JsonCharType item in types) 52             { 53                 if (currentType == item) 54                     return true; 55             } 56             return false; 57         } 58  59         /// <summary> 60         /// 向后推后一個字符 61         /// </summary> 62         /// <returns></returns> 63         public JsonCharType back() 64         { 65             currentIndex--; 66             return getCurrentIndex(); 67         } 68  69         /// <summary> 70         /// 獲得當前位置字符 71         /// </summary> 72         /// <returns></returns> 73         public JsonCharType current() 74         { 75             return getCurrentIndex(); 76         } 77  78         /// <summary> 79         /// 獲得當前位置的字符 80         /// </summary> 81         /// <returns></returns> 82         private JsonCharType getCurrentIndex() 83         { 84             if (currentIndex >= 0 && currentIndex < countIndex) 85             { 86                 char c = jsonSource[currentIndex]; 87                 return (JsonCharType)Enum.ToObject(typeof(JsonCharType), c); 88             } 89             else 90             { 91                 currentIndex = countIndex; 92             } 93             //else 驗證當前索引是否小于0 94             return JsonCharType.None; 95         } 96  97         /// <summary> 98         /// 查找該位置到下一個type間隔的文本 99         /// </summary>100         /// <param name="type"></param>101         /// <returns></returns>102         public string nextToType(JsonCharType type)103         {104             StringBuilder builder = new StringBuilder();105             JsonCharType currentType = next();106             while ((int)currentType != -1)107             {108                 if (currentType == type)109                 {110                     return builder.ToString();111                 }112                 else113                 {114                     builder.Append((char)currentType);115                     currentType = next();116                 }117             }118             throw new Exception("已到字符串末尾 沒有找到相關匹配");119         }120     }

其中的操作無疑就代表了位移字符等一些操作 返回基本都是以JsonCharType為準

然后我又寫了個類叫JsonSerialization 用于解析json結構

在此我就貼核心代碼了 剩下的大家自己研究 要是都給出來就沒意思了~

在這里我只提供思路

在JsonSerialization里有個FindObject的方法 還有個Deserializa用于解析json結構方法內有兩個參數一個是JsonObject是我自己定義的 還有一個是 JsonTokener就是上面的類

public JsonObject Deserializa(){    JsonTokener tokener = new JsonTokener(jsonSource);    JsonObject parentNode = new JsonObject();    //解析object    FindObject(parentNode, tokener);    return parentNode;}

這個FindObject 基本實現思路

JsonCharType type = tokener.next(JsonCharType.BeginArray,JsonCharType.BeginObject,JsonCharType.EndArray,JsonCharType.EndObject,JsonCharType.SingleQuote,JsonCharType.DoubleQuote,JsonCharType.Split,JsonCharType.Comma);

首先尋找這些字符

一般一個完整的json結構傳入都會以 { [ 開頭 以] }結束 為了做到完美適配各種json結構 我加入了單引號識別和雙引號識別

現在假設一個json結構 jsonp({"str_key":"value", "bool_test":true,"int_test":123,"double_test":12.7,"null_test":null,"array_test":["array1","array2",{"array_obj" : "array_obj"},["inner_array",1,12.2,true,null]]}) 當然上述的json結構是以jsonp跨域返回的串做的例子 我只是想證明 我做的這個解析會忽略掉jsonp頭也就是說從第一個{開始解析或者第一個[開始解析

好了扯遠了 既然找到了第一個列表包含的字符 那么就要進行進一步搜尋 也就是說還需要遞歸調用FindObject

所以第一個if也就有了

if (type == JsonCharType.BeginObject){    if (parentNode.IsArray)    {        JsonObject innerObj = new JsonObject();        //innerObj._parent = parentNode;        innerObj._isObject = true;        innerObj._sourceObj = new Dictionary<string, JsonObject>();        FindObject(innerObj, tokener);        parentNode.add(innerObj);        //繼續尋找        FindObject(parentNode, tokener);    }    else    {        parentNode._isObject = true;        parentNode._sourceObj = new Dictionary<string, JsonObject>();        FindObject(parentNode, tokener);    }}

為什么要有個parentNode.IsArray的判斷呢 是為了防止從上次遞歸過來的JsonObject為Array類型 然而遞歸到這里發現是Object的開頭

所以只需要新構建個JsonObject然后在尋找更下層的層級嵌套 然后添加進去 在繼續尋找直到找完位置

那個else的意思是代表了如果這個是初始化的操作也就是說一個沒有經過任何設置的JsonObject進行一個初始化并開始遞歸尋找

else if (type == JsonCharType.BeginArray){    tokener.lastIndex = tokener.CurrentIndex;    if (parentNode.IsObject)    {        JsonObject innerObj = new JsonObject();        //innerObj._parent = parentNode;        FindObject(innerObj, tokener);        parentNode.add(innerObj);        //繼續尋找        FindObject(parentNode, tokener);    }    else    {        if (parentNode.IsArray)        {            JsonObject innerObj = new JsonObject();            //innerObj._parent = parentNode;            innerObj._isArray = true;            innerObj._sourceObj = new List<JsonObject>();            FindObject(innerObj, tokener);            parentNode.add(innerObj);            //繼續尋找            FindObject(parentNode, tokener);        }        else        {            parentNode._isArray = true;            parentNode._sourceObj = new List<JsonObject>();            FindObject(parentNode, tokener);        }    }}

這段代碼是接上面的我一段一段的解釋

這段代碼意思是當發現起始json array結構時 判斷 上一個遞歸過來的節點是不是json object類型 如果是就構建一個新的JsonObject并添加

如果不是的話判斷上一個節點過來的是不是json array結構 如果是json array結構則又需要構建一個JsonObject 并添加

否則進行初始化設定并繼續尋找

else if (type == JsonCharType.DoubleQuote || type == JsonCharType.SingleQuote){    if (parentNode.IsObject)    {        //找尋key        string _key = tokener.nextToType(type);        JsonObject innerObj = new JsonObject();        //innerObj._parent = parentNode;        innerObj._key = _key;        FindObject(innerObj, tokener);        parentNode.add(innerObj);        //繼續尋找        FindObject(parentNode, tokener);    }    else if (parentNode.IsArray)    {        //找到value并添加value        string _value = tokener.nextToType(type);        JsonObject obj = new JsonObject();        //obj._parent = parentN
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本一区二三区好的精华液| 亚洲成人免费网站| 在线激情影院一区| 亚洲精品久久久一区二区三区| 国产成人+综合亚洲+天堂| 91精品久久久久久久久青青| 国产精欧美一区二区三区| 26uuu久久噜噜噜噜| 成人av在线网址| 久久九九有精品国产23| 成人国产精品色哟哟| 97人洗澡人人免费公开视频碰碰碰| 97精品视频在线| 成人激情视频在线播放| 国产成人高清激情视频在线观看| 91社区国产高清| 亚洲欧洲xxxx| 这里只有精品视频在线| 亚洲大胆人体av| 韩国19禁主播vip福利视频| 日韩精品视频在线观看免费| 成人激情视频在线观看| 欧美日韩中国免费专区在线看| 久久69精品久久久久久久电影好| 激情成人在线视频| 色综合天天综合网国产成人网| 在线亚洲午夜片av大片| 欧美成人h版在线观看| 国产午夜一区二区| 亚洲第一区第二区| 色中色综合影院手机版在线观看| 97av在线播放| 国产精品旅馆在线| 成人在线视频福利| 久久精品国产亚洲精品2020| 日韩在线视频观看正片免费网站| 亚洲精品国产精品自产a区红杏吧| 91精品国产成人| 欧美—级高清免费播放| 国产精品久久精品| 精品久久久久久| 久久九九热免费视频| 青青a在线精品免费观看| 国产精自产拍久久久久久| 狠狠躁天天躁日日躁欧美| 欧美大尺度激情区在线播放| 91视频国产高清| 高清欧美性猛交xxxx黑人猛交| 在线电影欧美日韩一区二区私密| 欧美黑人国产人伦爽爽爽| 亚洲韩国青草视频| 欧美精品一区在线播放| 国内精品400部情侣激情| 国外成人性视频| 日韩免费中文字幕| 自拍视频国产精品| 亚洲免费一级电影| 精品久久久久久久久久国产| 国产亚洲视频在线| 国产欧美久久一区二区| 久久91亚洲精品中文字幕奶水| 色狠狠久久aa北条麻妃| 中文字幕久热精品在线视频| 三级精品视频久久久久| 欧美激情免费观看| 在线精品视频视频中文字幕| 国产精品成人一区二区三区吃奶| 国产精品流白浆视频| 国产欧美日韩中文字幕| 日韩精品中文在线观看| 国产精品久久久久久久久免费看| 69av视频在线播放| 最近2019中文字幕mv免费看| 久久夜色精品国产欧美乱| 精品国产欧美一区二区五十路| 在线视频国产日韩| 欧美日本在线视频中文字字幕| 精品中文字幕在线2019| 久久精品国产一区二区三区| 久久乐国产精品| 日韩亚洲在线观看| 欧美国产日韩一区二区在线观看| 中文字幕亚洲无线码在线一区| 精品久久久久人成| 91国内精品久久| 国产区精品在线观看| 亚洲奶大毛多的老太婆| 高清欧美性猛交| 亚洲人成在线一二| 成人中心免费视频| 91色琪琪电影亚洲精品久久| 国产精品亚洲自拍| 国产视频一区在线| 欧美成人精品在线播放| 国产精品自产拍在线观看| 国产精品揄拍500视频| 人人澡人人澡人人看欧美| 亚洲白虎美女被爆操| 色偷偷噜噜噜亚洲男人| 欧美日韩国产一区在线| 538国产精品一区二区免费视频| 国产精品网站大全| 国产精品久在线观看| 日韩69视频在线观看| 日韩视频亚洲视频| 亚洲欧美日韩视频一区| 午夜精品一区二区三区在线播放| 欧美日韩综合视频| 国产区精品视频| 91成人在线观看国产| 精品国产依人香蕉在线精品| 欧美日韩激情美女| 精品精品国产国产自在线| 国产精品日韩精品| 色噜噜国产精品视频一区二区| 欧美极品少妇xxxxx| 欧美在线不卡区| 亚洲欧美国产日韩中文字幕| 亚洲美女在线看| 91精品久久久久| 欧美亚洲国产日本| 国产美女91呻吟求| 欧美电影在线播放| 久久在线免费视频| 欧美精品激情在线观看| 精品久久久久久久久中文字幕| 日韩av网站导航| 久久成人精品一区二区三区| 色999日韩欧美国产| 日韩av影院在线观看| 91在线高清免费观看| 国产精品一区二区女厕厕| 国产精品入口免费视频一| 久久不射电影网| 亚洲精品国产成人| 97人洗澡人人免费公开视频碰碰碰| 亚洲伊人久久大香线蕉av| 国产精品老女人精品视频| 国产精品999999| 久久成人精品电影| 亚洲v日韩v综合v精品v| 日本精品性网站在线观看| 国产精品网红直播| 美女视频久久黄| 国产精品99久久久久久白浆小说| 亚洲国产精品资源| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产精品美女| 尤物99国产成人精品视频| 国产日韩欧美影视| 国产午夜精品麻豆| 影音先锋欧美精品| 成人xvideos免费视频| 成人福利在线观看| 亚洲免费人成在线视频观看| 成人免费在线网址| 91在线观看免费网站| 欧美成人h版在线观看| 国产日韩在线看| 在线亚洲欧美视频| 欧美日韩免费网站| 欧美黑人性生活视频| 成人自拍性视频| 国产精选久久久久久|