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的值的开头为下面几种情况之一:
分别对应的输入为:
- \”字符串\”
- 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. */ }
解释字符串
把两个双引号之间的字符串