1. 解析数字
static const char *parse_number(cJSON *item,const char *num)
{
double n=0,sign=1,scale=0;int subscale=0,signsubscale=1;
if (*num=='-') sign=-1,num++;/* Has sign? */
if (*num=='0') num++;/* is zero */
if (*num>='1' && *num<='9')don=(n*10.0)+(*num++ -'0');while (*num>='0' && *num<='9');/* Number? */
if (*num=='.' && num[1]>='0' && num[1]<='9') {num++;don=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');}/* Fractional part? */
if (*num=='e' || *num=='E')/* Exponent? */
{num++;if (*num=='+') num++;else if (*num=='-') signsubscale=-1,num++;/* With sign? */
while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0');/* Number? */
}
n=sign*n*pow(10.0,(scale+subscale*signsubscale));/* number = +/- number.fraction * 10^+/- exponent */
item->valuedouble=n;
item->valueint=(int)n;
item->type=cJSON_Number;
return num;
}
item是传进来的cjson object, num是起始数字。
1. 解析正负, 用sign 标记, -1 是负
2. 判断是不是0
3. 判断小数点前面的数字, 也就是 - 3.2 e 5 , 前面的3.2, 这个分为两部分, 小数点前和后
4. e或者E,即科学计数的后半部分, 这个时候需要处理一下科学计数的部分是不是正或者负的问题, 用signsubscale 记录。
5. 然后直接解析, 这里作者用了个小技巧,