最近很忙,项目的需要,先是搞了搞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