【 在 ylh0315 的大作中提到: 】
:
: 这个是反序列化程序,符合楼主要求。我只得老老实实写个程序。
: int json_to_struct(void *data,JSON_OBJECT json,T_PkgType *typ) //typ就是模板,template
: ...................
看看它干了啥:
int put_str_one(void *buf,char *cp,T_PkgType *typ,char CURDLM)
{
int ret;
register char *cp1;
cp1=typ->offset+(char *)buf; //找到成员的位置
ret=0;
switch(typ->type) { //判断类型
case CH_CLOB:
*(char **)cp1=cp;
if(CURDLM) strcpy_esc(cp,cp,-1,CURDLM); //有问题
typ->len=strlen(cp);
ret=1;
break;
case CH_BYTE:
byte_cpy(cp1,cp,typ->len);
ret=1;
break;
case CH_DATE:
case CH_CNUM:
case CH_CHAR:
*cp1=0;
strcpy_esc(cp1,cp,typ->len,CURDLM);
ret=1;
break;
case CH_FLOAT:
*(float *)cp1=strtof(cp,&cp);;
ret=1;
break;
case CH_DOUBLE:
*(double *)cp1=strtod(cp,&cp);;
ret=1;
break;
case CH_LDOUBLE:
*(long double *)cp1=strtold(cp,&cp);
break;
case CH_JUL:
case CH_CJUL:
if(!*cp) *(INT4 *)cp1=INTNULL;
else if(typ->format){
*(int *)cp1=rstrfmttojul(cp,
typ->format);
} else {
*(int *)cp1= rstrjul(cp);
}
ret=1;
break;
case CH_MINUTS:
case CH_CMINUTS:
if(!*cp) *(INT4 *)cp1=INTNULL;
else if(typ->format){
*(INT4 *)cp1=rstrminfmt(cp,typ->format);
} else *(INT4 *)cp1=rstrmin(cp);
ret=1;
break;
case CH_TIME:
case CH_CTIME:
if(!*cp) *(INT64 *)cp1=INT64NULL;
else if(typ->format){
*(INT64 *)cp1=rstrsecfmt(cp,typ->format);
} else *(INT64 *)cp1=rstrsecfmt(cp,"YYYYMMDDHH24MISS"); //ORACLE的,其他数据库可能需要改变。
ret=1;
break;
case CH_USEC:
if(!*cp) *(INT64 *)cp1=INT64NULL;
else if(typ->format){
*(INT64 *)cp1=rstrusecfmt(cp,typ->format);
} else *(INT64 *)cp1=rstrusecfmt(cp,"YYYYMMDDHH24MISS.FF6");
ret=1;
break;
case CH_TINY:
{
int tmp;
if(!*cp) {
*cp1=TINYNULL;
break;
}
tmp=atoi(cp);
*cp1=(char)tmp;
break;
}
case CH_SHORT:
*(short *)cp1=SHORTNULL;
ret=sscanf(cp,"%hd",(short *)cp1);
ret=1;
break;
case CH_INT:
if(!*cp) {
*(int *)cp1=INTNULL;
break;
}
*(int *)cp1=atoi(cp);
break;
case CH_LONG:
if(!*cp) {
*(long *)cp1=LONGNULL;
break;
}
*(long *)cp1=strtol(cp,&cp,10);
break;
case CH_INT64:
if(!*cp) {
*(INT64 *)cp1=INT64NULL;
break;
}
*(INT64 *)cp1=strtoll(cp,&cp,10);
break;
default:
ret=0;
break;
}
return ret;
}
--
修改:ylh0315 FROM 221.221.52.*
FROM 221.221.52.*