cJSONコード読解(6)——JSON数値解析
parse_numberはjson数値解析を行う関数である.
1、まず数値にマイナス記号があるかどうかを判断する
2、数値の先頭の0をスキップ
3、数値を計算する整数部分——文字列から数値に変換する
4、数値を計算する小数部——文字列から数値に変換する
5、次のjsonデータの位置を返す
1、まず数値にマイナス記号があるかどうかを判断する
2、数値の先頭の0をスキップ
3、数値を計算する整数部分——文字列から数値に変換する
4、数値を計算する小数部——文字列から数値に変換する
5、次のjsonデータの位置を返す
/* Parse the input text to generate a number, and populate the result into item. */
//
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? */
// 0
if (*num=='0')
num++; /* is zero */
// ( )
if (*num>='1' && *num<='9')
do
n=(n*10.0)+(*num++ -'0');
while (*num>='0' && *num<='9'); /* Number? */
// ,
if (*num=='.' && num[1]>='0' && num[1]<='9')
{
num++;
do
n=(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;
}