cJSON代码阅读(10)——把数值构造成JSON格式

print_number是对数值进行格式化的主要函数
1、首先判断数值是否为0,如果是0,那么直接把0转换成字符串"0",然后返回
2、如果数值可以使用整数表达,那么对这个数值进行整形的格式化
3、对于其他的数值(即不是0,也不能用整形表示的其他浮点数),进行浮点型的格式化

/* Render the number nicely from the given item into a string. */
// 把json节点中的数值转换为字符串
static char *print_number(cJSON *item,printbuffer *p)
{
    char *str=0;

    double d=item->valuedouble;

    // 如果值是0
    if (d==0)
    {
        if (p)
            str=ensure(p,2);
        else
            str=(char*)cJSON_malloc(2);	/* special case for 0. */

        if (str)
            strcpy(str,"0");
    }
    // 格式化可以使用整数表达的浮点数(DBL_EPSILON是浮点数能够表达的最小精确值,如果两个数之差小于DBL_EPSILON,那么计算机会认为他们相等)
    else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN)
    {
        if (p)
            str=ensure(p,21);
        else
            str=(char*)cJSON_malloc(21);	/* 2^64+1 can be represented in 21 chars. */

        if (str)
            sprintf(str,"%d",item->valueint);
    }
    // 格式化那些不是0也不能用整数表达的浮点数
    else
    {
        if (p)
            str=ensure(p,64);
        else
            str=(char*)cJSON_malloc(64);	/* This is a nice tradeoff. */

        if (str)
        {
            if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)
                sprintf(str,"%.0f",d);
            else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9)
                sprintf(str,"%e",d);
            else
                sprintf(str,"%f",d);
        }
    }
    return str;
}

你可能感兴趣的:(c,json,C语言)