cJSON源码解释(二)--解释输入

cJSON解析字符串,将其转化为树形结构。主要解析函数parse_value()处理字符串、数字、数组和对象。字符串处理涉及转义和unicode编码,数字支持科学计数法,数组和对象以链表形式组织,允许嵌套。
摘要由CSDN通过智能技术生成

cJSON解释

把读入的字符串解释成一颗树,具体的结构参考

对这个部分更加详尽的注释可以参考:http://www.cnblogs.com/zengjfgit/p/4314330.html

/* 跳过空格和回车键,换行符和ascii码小于等于32的字符,cr是回车键,键码值为13,lf是换行键,键码是12,空格的键码值为32*/
static const char *skip(const char *in) {
    while (in && *in && (unsigned char)*in<=32) 
        in++; 
    return in;
}

/* Default options for cJSON_Parse */
cJSON *cJSON_Parse(const char *value) {
    return cJSON_ParseWithOpts(value,0,0);
}

/* Parse an object - create a new root, and populate. */
/*解析一个对象,创建一个新的根节点*/
cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated)
{
    const char *end=0;
    cJSON *c=cJSON_New_Item();
    ep=0;                   
    if (!c) return 0;       /* memory fail */

    end=parse_value(c,skip(value));
    if (!end){
        cJSON_Delete(c);
        return 0;
    }    /* parse failure. ep is set. */

    /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */
    if (require_null_terminated) {
        end=skip(end);
        if (*end) {
            cJSON_Delete(c);
            ep=end;
            return 0;
            }
    }
    if (return_parse_end)
        *return_parse_end=end;
    return c;
}

最主要的解释函数就是parese_value(),注意到形参value的值的开头为下面几种情况之一:

 

tttttttt

分别对应的输入为:

  • \”字符串\”
  • l数字
  • {
  • [
  • true
  • false
  • null

当要解释的字符串的前几个字符是null,false或者true的时候,只是简单的设置了节点的type成员字段然后就返回,而遇到剩余的情况时,就需要特别的解释函数

static const char *parse_value(cJSON *item,const char *value)
{
    if (!value)                        return 0;    /* Fail on null. */
    if (!strncmp(value,"null",4)){ 
        item->type=cJSON_NULL;  
        return value+4; 
    }
    if (!strncmp(value,"false",5)){ 
        item->type=cJSON_False; 
        return value+5; 
    }
    if (!strncmp(value,"true",4)){ 
        item->type=cJSON_True; 
        item->valueint=1;    
        return value+4; 
    }
    if (*value=='\"'){ 
        return parse_string(item,value); 
    }
    if (*value=='-' || (*value>='0' && *value<='9')){ 
    return parse_number(item,value);
     }
    if (*value=='['){ 
        return parse_array(item,value); 
    }
    if (*value=='{
   '){ 
        return parse_object(item,value); 
    }

    ep=value;return 0;    /* failure. */
}

解释字符串

把两个双引号之间的字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值