cJSON代码阅读(7)——解析JSON数组

parse_array是进行json数组解析的函数。
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. */
}


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