parse_array是进行json数组解析的函数。
1、首先判断待处理数据是不是数组
2、跳过数组的左中括号
3、跳过那些无用的空白字符
4、如果紧接着的是右中括号,那么表示数组是空的,直接返回
5、如果数组不空,那么调用parse_value解析数组的第一个元素,如果解析没有出错,而且紧接着的是逗号,那么表示数组还有其他元素,进入一个循环,依次解析每一个元素
6、跳过空白字符之后,判断接下来的字符是否为右中括号,如果不是那么出错
1、首先判断待处理数据是不是数组
2、跳过数组的左中括号
3、跳过那些无用的空白字符
4、如果紧接着的是右中括号,那么表示数组是空的,直接返回
5、如果数组不空,那么调用parse_value解析数组的第一个元素,如果解析没有出错,而且紧接着的是逗号,那么表示数组还有其他元素,进入一个循环,依次解析每一个元素
6、跳过空白字符之后,判断接下来的字符是否为右中括号,如果不是那么出错
7、如果处理正确,那么返回下一个json数据的位置
/* Build an array from input text. */
// 解析数组
static const char *parse_array(cJSON *item,const char *value)
{
cJSON *child;
// 确定是不是数组
if (*value!='[')
{
ep=value;
return 0;
} /* not an array! */
item->type=cJSON_Array;
// 跳过左中括号
value=skip(value+1);
// 如果下一个字符是右中括号,表示数组结束(同时表示它是一个空数组)
if (*value==']')
return value+1; /* empty array. */
item->child=child=cJSON_New_Item();
if (!item->child)
return 0; /* memory fail */
// 先跳过空白字符,然后解析数组中的第一个元素(重复调用了parse_value,进行递归操作),然后跳过空白字符
value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */
// 判断是否出错
if (!value)
return 0;
// 如果遇到的是逗号,表示后面还有元素,继续解析
while (*value==',')
{
cJSON *new_item;
if (!(new_item=cJSON_New_Item()))
return 0; /* memory fail */
child->next=new_item;
new_item->prev=child;child=new_item;
// 解析
value=skip(parse_value(child,skip(value+1)));
if (!value)
return 0; /* memory fail */
}
// 判断是否以右边中括号结尾,如果不是,那么表示出错
if (*value==']')
return value+1; /* end of array */
ep=value;
return 0; /* malformed. */
}