青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Jsonajax領域很流行,記得當時看過它的介紹后很興奮,網上找了一些解析jsonc

 

c++代碼,不過沒有找到特別好的,有的寫得不錯不過要依賴于boost,有的用c寫的不大好用,好在json語法簡單,參考了一些c/c++json解析代碼做了一個json類,最近又把去年寫的json類修改為unicode下使用,增了一些功能,現在CJsonw可以解析const char *型輸入,也可解析const wchar_t *型輸入,可解析ansi編碼、unicode編碼、utf8編碼的json文件。看看我的CJsonw定義:

 

        JsonwType type;                     //Json類型, true false null直接由類型表示了

        DWORD tag;                            //tag,用戶自用值,默認為0

        union

        {

                struct{

                        wchar_t *cstring;//字符串型值

                        int clen;            //cstring按照字符計算的分配個數,包括可能的0

                };

                double dvalue;          //double

                struct

                {

                        int ivalue;         //int

                        DWORD dwhigh;       //高部

                };

                __int64 i64value;        //int64

                OBJS *objs;                     //對象型值

                ARRAYS *arrays;             //數組型值

        };

Sizeof(CJsonw) == 16

OBJS類型描述無序的key-value型數據,ARRAYS描述 array型有序數據,定義如下:

        typedef CHashiW<CJsonw *, CJsonw *> OBJS;

        typedef std::vector<CJsonw *> ARRAYS;

支持以下構造函數:

        CJsonw(JsonwType t=json_null);

        CJsonw(int value);

        CJsonw(__int64 value);

        CJsonw(float value);

        CJsonw(double value);

        CJsonw(const wchar_t *value);

        //數組型構造函數

        CJsonw(int *numbers, int count);

        CJsonw(__int64 *numbers, int count);

        CJsonw(float *numbers, int count);

        CJsonw(double *numbers, int count);

        CJsonw(const wchar_t **strings, int count);

支持以下賦值函數:

        bool setnull();

        bool set(bool value);

        bool set(int value);

        bool set(__int64 value);

        bool set(float value);

        bool set(double value);

        bool set(const wchar_t *value);

        bool set(int *numbers, int count);

        bool set(__int64 *numbers, int count);

        bool set(float *numbers, int count);

        bool set(double *numbers, int count);

        bool set(const wchar_t **strings, int count);

       

        //修改常規值,就是true, false, int, real, string

        bool setbystring(const wchar_t *value);

 

支持以下輸入:

        bool parse(const char *string);

        bool parse(const wchar_t *string);

        bool parsefile(FILE *fp);

        bool parsefile(LPCTSTR filename);

文件可以ansi編碼、unicode編碼、或者utf8編碼

 

支持以下wchar_t型輸出:

        //dump,默認為unicode編碼

        //uunicode表示字符串中的unicode字符是否按照\uxxxx格式輸出

        //bDisptrue按照友好格式顯示,會輸出\t換行等方便閱讀

        //bDispfalse按照緊湊模式顯示,沒有多余字符,方便網絡傳輸等場合

        bool dump(CBlockBuffer *pbk, bool bNameQuotes=true, bool uunicode=false, bool bDisp=true);

        //跟上面的dump一樣,但如果成功會在buf里面插入一個'\0'字符

        bool dump0(CBlockBuffer *pbk, bool bNameQuotes=true, bool uunicode=false, bool bDisp=true);

        bool save(LPCTSTR filename);

        bool save(FILE *fp);

保存到文件默認為UNICODE格式

 

支持以下ANSI型輸出:

        //a系列dumpansi編碼輸出

        //bDisptrue按照友好格式顯示,會輸出\t換行等方便閱讀

        //bDispfalse按照緊湊模式顯示,沒有多余字符,方便網絡傳輸等場合

        bool dumpa(CBlockBuffer *pbk, bool bNameQuotes=true, bool uunicode=true, bool bDisp=true);

        //跟上面的dump一樣,但如果成功會在buf里面插入一個'\0'字符

        bool dumpa0(CBlockBuffer *pbk, bool bNameQuotes=true, bool uunicode=true, bool bDisp=true);

ANSI型輸出主要用在節省網絡帶寬或者和其他系統交換數據的情況下。

 

支持以下類型判別函數:

        //類型判別函數

        bool IsArray() const { return type==json_array; }

        bool IsObject() const { return type==json_object; }

        bool IsInt() const { return type==json_int; }

        bool IsReal() const { return type==json_real; }

        bool IsNumber() const { return IsInt()||IsReal(); }

        bool IsNull() const { return type==json_null; }

        bool IsTrue() const { return type==json_true; }

        bool IsFalse() const { return type==json_false; }

        bool IsString() const { return type==json_string; }

 

支持以下一些直接取值函數:

        const wchar_t *getordef(const wchar_t *strdef)

        int getordef(int idef)

        __int64 getordef(__int64 idef)

        double getordef(double ddef)

        bool getordef(bool bdef)

        //array的元素

        CJsonw *get(int n)

        CJsonw *operator[](int n) const

        //obj的元素

        CJsonw *get(const wchar_t *name)

        CJsonw *operator[](const wchar_t *name) const

 

支持以下取array型子元素數據的函數:

        const wchar_t *getordef(int n, const wchar_t *strdef)

        int getordef(int n, int idef)

        __int64 getordef(int n, __int64 idef)

        double getordef(int n, double ddef)

        bool getordef(int n, bool bdef)

 

支持以下取obj型子元素數據的函數:

        const wchar_t *getordef(const wchar_t *name, const wchar_t *strdef)

        int getordef(const wchar_t *name, int idef)

        __int64 getordef(const wchar_t *name, __int64 idef)

        double getordef(const wchar_t *name, double ddef)

        bool getordef(const wchar_t *name, bool bdef)

 

支持以下obj遍歷函數:

        //遍歷函數,最常見寫法:

        //for(CJsonw::OBJIT *p=xxx.FirstObj(); p; p=p->next())...

        OBJIT *firstobj()

 

        //arrayobject元素個數,string類型返回分配的字符個數(包括可能的),其他類型都返回

        int size() const

 

另外支持一些增加array子元素函數:

        bool add(CJsonw *pnode)

        bool del(int n, bool bfree=true)

        bool addnull(){ return add(new CJsonw(json_null)); }

        bool addtrue(){ return add(new CJsonw(json_true)); }

        bool addfalse(){ return add(new CJsonw(json_false)); }

        bool add(int value){ return add(new CJsonw(value)); }

        bool add(__int64 value){ return add(new CJsonw(value)); }

        bool add(float value){ return add(new CJsonw(value)); }

        bool add(double value){ return add(new CJsonw(value)); }

        bool add(const wchar_t *value){ return add(new CJsonw(value)); }

 

也支持obj增加刪除子對象函數:

        bool addobj(const wchar_t *name, CJsonw *pnode)

        bool delobj(const wchar_t *name, bool bfree=true)

        bool addobjnull(const wchar_t *name){ return addobj(name, new CJsonw(json_null)); }

        bool addobjtrue(const wchar_t *name){ return addobj(name, new CJsonw(json_true)); }

        bool addobjfalse(const wchar_t *name){ return addobj(name, new CJsonw(json_false)); }

        bool addobj(const wchar_t *name, int value){ return addobj(name, new CJsonw(value)); }

        bool addobj(const wchar_t *name, __int64 value){ return addobj(name, new CJsonw(value)); }

        bool addobj(const wchar_t *name, float value){ return addobj(name, new CJsonw(value)); }

        bool addobj(const wchar_t *name, double value){ return addobj(name, new CJsonw(value)); }

        bool addobj(const wchar_t *name, const wchar_t *value){ return addobj(name, new CJsonw(value)); }

 

還有一些特殊函數:

        //計算整個樹的crc

        DWORD calccrc();

        //計算整個樹的md5,要求md5不少于個字節

        byte *calcmd5(byte *md5);

        //計算hex表示的md5,不寫尾部,要求md5hex不少于個字符

        char *calcmd5hex(char *md5hex, const byte x='x');

        //計算hex表示的md5,寫尾部,要求md5hex不少于個字符

        char *calcmd5hex0(char *md5hex, const byte x='x');

 

 

json類上花了較多時間,主要是覺得這個類很有用,可以描述任意對象,易保存易傳輸易構造,對速度要求不苛刻的應用程序用json作為基本數據結構很合適,配合json里面的data自定義字段理論上支持描述任意對象,配合使用一些cache可擴大json類的使用范圍,用它取代ini xml等配置簡直是大材小用,用json類來做stringtable簡直就是小菜一碟,而且還是hash級高效率,絲毫不比手工做一個hash_map<,>表差。

在實際應用中,去年有一個網絡驗證的項目就大量使用了這個類,配置、幫助都是json格式,應用中管理大量對象的內存數據庫也是用了json類,編碼后直接網上傳輸,server內部也是一個json對象直接管理了大量用戶的信息,非常方便,可以說用json類使得這個程序少寫了大量代碼,也使得整個項目只用了1個月時間就做出來了,還部署成master – master- slave(N)模式穩定運行了將近1年時間。

在另一些網絡應用中,俺將json格式數據作為變長包使用,前面俺寫過一篇短文介紹了變長包最常見的幾種格式,分別是:

1、 key\0value\0…

2、 json格式

3、 xml格式

使用json格式作為變長包現在很流行,這也是大量ajax所采用所依賴的技術,qq種菜,google搜索預列表都是采用json格式的。

Posted on 2010-10-03 14:17 袁斌 閱讀(923) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线亚洲在线| 一区二区三区欧美成人| 亚洲麻豆一区| 亚洲啪啪91| 亚洲精品五月天| 99v久久综合狠狠综合久久| 亚洲国产精品久久久久秋霞蜜臀| 国产婷婷色一区二区三区四区| 国产精品爽爽爽| 国产永久精品大片wwwapp| 一区二区亚洲精品国产| 亚洲高清久久| 亚洲一品av免费观看| 午夜精品福利电影| 久久久亚洲精品一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美ab在线视频| 亚洲免费观看高清在线观看| 亚洲午夜一区二区| 久久国产精品久久久久久| 久久夜色精品国产亚洲aⅴ| 欧美大片一区二区| 国产精品你懂的| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美成人免费在线观看| 欧美精品日韩| 国产日韩在线一区| 亚洲日本精品国产第一区| 亚洲欧美日韩在线综合| 免费观看成人网| 在线视频欧美一区| 美女日韩在线中文字幕| 国产精品你懂的在线欣赏| 亚洲国产日韩欧美一区二区三区| 在线亚洲欧美专区二区| 老司机午夜精品视频| 亚洲视频在线观看一区| 欧美xx69| 激情久久久久久久久久久久久久久久| 亚洲三级性片| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲欧美日韩精品久久亚洲区| 久久国产日韩| 日韩视频中文| 免费毛片一区二区三区久久久| 欧美日韩亚洲不卡| 亚洲国产成人tv| 久久福利毛片| 亚洲视频专区在线| 欧美日韩黄色大片| 亚洲精品在线看| 久久精品99| 亚洲欧美激情精品一区二区| 欧美日韩国产在线观看| 亚洲精品三级| 亚洲高清av在线| 欧美一区二区视频97| 欧美性猛片xxxx免费看久爱| 亚洲国产欧美一区二区三区久久| 亚洲女人小视频在线观看| 亚洲日本aⅴ片在线观看香蕉| 久久夜色精品| 亚洲福利视频免费观看| 免费成人性网站| 久久综合久久久久88| 伊人夜夜躁av伊人久久| 久久综合九色99| 久久久999| 亚洲国产精品99久久久久久久久| 老司机凹凸av亚洲导航| 久久久国产精品一区二区三区| 国产伪娘ts一区| 久久香蕉国产线看观看av| 久久国产日韩| 亚洲精品免费一二三区| 亚洲精品国偷自产在线99热| 欧美午夜电影在线| 亚洲欧美日韩精品久久久| 亚洲欧美国产va在线影院| 国产性色一区二区| 免费成人网www| 欧美精品自拍偷拍动漫精品| 99精品国产热久久91蜜凸| 一本色道婷婷久久欧美| 国产欧美一区二区三区久久人妖 | 亚洲精品一区二区三区在线观看 | 欧美一区综合| 亚洲欧洲日本一区二区三区| 亚洲日本无吗高清不卡| 久久久久久久高潮| 亚洲精品国产日韩| 一区二区三区视频在线| 国产有码在线一区二区视频| 欧美大尺度在线| 欧美日韩在线一二三| 久久精品日韩一区二区三区| 久久伊人亚洲| 一片黄亚洲嫩模| 欧美一区二区三区在线免费观看| 亚洲国产日韩欧美在线动漫| 亚洲一区二区av电影| 亚洲国产你懂的| 亚洲欧美一区二区视频| 亚洲日本在线观看| 午夜视频精品| 一区二区三区国产精品| 久久精品国产91精品亚洲| 亚洲小说欧美另类社区| 久久亚洲综合| 久久精品国产清自在天天线| 欧美激情一级片一区二区| 欧美在线观看www| 欧美日韩一区二区三区在线| 裸体歌舞表演一区二区| 国产精品一区一区三区| 亚洲激情影院| 亚洲高清免费| 久久av红桃一区二区小说| 亚洲欧美久久久| 欧美日韩久久不卡| 久久另类ts人妖一区二区 | 国产三级精品在线不卡| 亚洲人永久免费| 亚洲欧洲一区二区三区久久| 亚欧成人在线| 亚洲欧美色一区| 欧美性猛交xxxx乱大交退制版 | 国产字幕视频一区二区| 亚洲性色视频| 亚洲图片欧洲图片av| 男人的天堂亚洲| 欧美成人综合网站| 黄色成人在线| 久久www免费人成看片高清 | 亚洲免费观看| 宅男噜噜噜66一区二区| 欧美久久电影| 日韩亚洲欧美一区| 亚洲精品美女免费| 欧美激情一区三区| 亚洲欧洲精品一区二区三区不卡 | 欧美在线观看视频| 午夜免费日韩视频| 国产女精品视频网站免费 | 亚洲乱码精品一二三四区日韩在线| 亚洲字幕在线观看| 欧美一区二区三区免费观看 | 欧美另类在线观看| 亚洲人成小说网站色在线| 亚洲精品国久久99热| 欧美精品激情在线| av成人黄色| 久久精品一区四区| 亚洲盗摄视频| 欧美日本不卡高清| 夜夜夜精品看看| 久久国产精品99精品国产| 国产一区二区日韩精品欧美精品| 久久精品国产亚洲一区二区三区| 久久这里只有| 亚洲伦伦在线| 国产精品综合色区在线观看| 亚洲欧美激情视频在线观看一区二区三区| 午夜影院日韩| 一区在线视频| 欧美日韩小视频| 欧美主播一区二区三区| 欧美成人中文字幕| 亚洲一二三区在线| 国产专区欧美专区| 欧美另类视频| 性欧美暴力猛交69hd| 欧美国内亚洲| 午夜精品久久久久久久99樱桃| 精久久久久久| 欧美日韩一区二区三| 欧美综合第一页| 日韩亚洲综合在线| 久久久久久高潮国产精品视| 亚洲精品一区二区三区婷婷月 | 国产精品午夜在线| 久久在精品线影院精品国产| 亚洲理论电影网| 久久亚洲影院| 亚洲欧美国产一区二区三区| 一区二区三区无毛| 国产精品久久久久婷婷| 老牛嫩草一区二区三区日本| 亚洲专区一区二区三区| 亚洲黄色成人久久久| 久久久久久91香蕉国产| 亚洲欧美激情视频| 99国内精品| 黄色日韩在线| 国产女主播一区二区三区| 麻豆av一区二区三区| 欧美一区二区三区在线看| 99riav久久精品riav| 亚洲国产99精品国自产| 久久综合色综合88|