木槿巴巴

使用cJson[C语言]解析json..

最近很忙,项目的需要,先是搞了搞SOAP,使用gSoap来处理Web service服务端和客户端,确实相当方便,正当搞得莫名其妙时,迎来了五一小长假,回了趟家,一周之后回来,接到的是用json…..JSON?XML?SOAP…?使用gSoap,json-c,libjson?额滴神啊(这其实不是陕西话,原意:MY GOD!)怎么办,搞呗… JSON(JavaScript Object Notation):     http://www.json.org/json-zh.html SOAP(Simple Object Access Protocol ):  http://www.w3school.com.cn/soap/index.asp    http://zh.wikipedia.org/wiki/SOAP 对于出现的所有工具,方法,库可以Google之,我只是把我用json的一些体会记录下来,我只是使用C对简单json报文解析,效率要考虑。 I.编译Jansson换过好多种开源库或code:json-c 看起来确实不错,似乎兼容性差点儿,Linux上一切顺利,在AIX上就是编译不过,修改之后,一到创建或访问对象总会莫名down掉,只能Pass掉;然后的libjson,mjson…我都忘记怎么就没用它们,最后用了Jansson,看起来确实简单,只有cJSON.h和cJSON.c,把它们包含到工程中就OK了,Makefile加入,编译,Oh,SHIT! 出错:

    ERROR: Undefined symbol: .__floor
AIX真是爷!查阅好多资料,似乎咱的xlc编译器太shit了,好像使用gcc也这样...那么一个论坛上看到(其它不知道法文还是什么的http://www.developpez.net),AIX中include头文件math.h>>>>>
#ifdef __MATH__
#define acos(__x)         __acos(__x)
#define asin(__x)         __asin(__x)
#define atan(__x)         __atan(__x)
#define atan2(__x,__y)      __atan2(__x,__y)
#define cos(__x)          __cos(__x)
#define exp(__x)          __exp(__x)
#define fabs(__x)         __fabs(__x)
#define log(__x)          __log(__x)
#define log10(__x)        __log10(__x)
#define sin(__x)          __sin(__x)
#define sqrt(__x)         __sqrt(__x)
#define tan(__x)          __tan(__x)
将其中:
#ifdef __IBMC__
#if (__xlC__ >= 0x0600) /* VAC version 6 and above */
#define floor(__x)        __floor(__x)
#define ceil(__x)         __ceil(__x)
#endif /* __xlC__ >= 0x0600 */
#endif /* __IBMC__ */

修改为:

#ifdef __IBMC__
#if (__xlC__ >= 0x0600) /* VAC version 6 and above */
#define floor(__x)        floor(__x)
#define ceil(__x)         ceil(__x)
#endif /* __xlC__ >= 0x0600 */
#endif /* __IBMC__ */

编译通过…… II.Jansson解析json这里不多说了,担心误人子弟..简单几点,原来代码不提供long long解析,不提供直接遍历…由于我用到解析,只是把标签值取出来;把代码贴出来,只是简单测试..头文件cJSON.h和source cJSON.c按照我的需求做了更改,就不贴出来了,以下code供参考测试….[前方有怪兽….]

cJSON* pRoot = cJSON_Parse ( jsonString );
    while ( pRoot )
    {
        do
        {
            pItem = cJSON_GetObjectItem ( pRoot, "Code");
            if(pItem){
                switch(type)
                {
                    case 0:
                        strcpy(out,pItem->valuestring);
                        break;
                     case 1:
                        sprintf(out,"%d",pItem->valueint);
                        break;
                     case 2://long long
                        sprintf(out,"%lld",pItem->valuellong);
                        break;
                     case 3://double
                        sprintf(out,"%lf",pItem->valuedouble);
                        break;
                     case 4: //array
                        nCount = cJSON_GetArraySize( pItem); //获取pArray数组的大小,仅对字符串元素?
                        for( i= 0; i < nCount; i++)
                        {
                            pArrayItem = cJSON_GetArrayItem(pItem, i);
                            strcat(out,cJSON_Print( pArrayItem));
                           // sprintf(out,"%s",out,pArrayItem);
                        }
                        break;
                }
            }
            else if(pRoot->next)
               pRoot=pRoot->next;
            else break;

        }while(!pItem&&pRoot);     
        if(pRoot->child)
           pRoot=pRoot->child;
     }
    继续吧,好多活等着做..忙啊,累啊...对了还要用到Curl..
    欢迎浏览,难免疏漏,转载需谨慎....
 ——————————————————————————————————————————————————————————吉吉博客gejo.in
Exit mobile version