cJSON代码阅读(8)——解析JSON对象

parse_object是进行json对象解析的函数。
1、首先判断待处理数据是不是对象(以左大括号开始)
2、跳过数组的左大括号,跳过空白字符
3、如果紧接着的是右大括号,那么表示对象是空的,返回
4、使用parse_string处理对象中第一个属性(也可以叫键值对,我比较喜欢把对象里的键值对叫做属性)的名字,判断紧接着的是不是一个冒号,如果不是,那么表示属性只有名字而没有值,错误。如果没有出错,使用parse_value处理第一个属性的值
5、跳过空白字符之后,判断紧接着的是不是逗号,如果是逗号,那么表示对象还有其他属性,则进入一个循环,依次处理每一个属性

6、跳过空白字符,判断紧接着的是不是右大括号,如果不是,表示大括号不匹配,出错!如果没有错误,那么返回下一个json数据的位置

/* Build an object from the text. */
// 解析对象
static const char *parse_object(cJSON *item,const char *value)
{
    cJSON *child;

    // 判断是否以左大括号开始
    if (*value!='{')
    {
        ep=value;
        return 0;
    }	/* not an object! */

    item->type=cJSON_Object;

    // 跳过空白字符
    value=skip(value+1);

    // 如果下一个字符就是右大括号,那么表示,对象处理结束(同时表示这个对象是空的)
    if (*value=='}')
        return value+1;	/* empty array. */

    item->child=child=cJSON_New_Item();

    if (!item->child)
        return 0;

    // 先跳过空白字符,然后解析对象里面的属性的名字(字符串),然后再跳过空白字符
    // 属性的名字都是字符串
    value=skip(parse_string(child,skip(value)));

    // 判断是否出错
    if (!value)
        return 0;

    // 记录对象中,属性的名字
    child->string=child->valuestring;
    child->valuestring=0;

    // 如果当前字符不是冒号,那么表示,这个属性只有名字而没有值,错误!!!
    if (*value!=':')
    {
        ep=value;
        return 0;
    }	/* fail! */

    // 跳过冒号,跳过空白字符,解析属性的值,再跳过空白字符
    value=skip(parse_value(child,skip(value+1)));	/* 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_string(child,skip(value+1)));

        if (!value)
            return 0;

        child->string=child->valuestring;
        child->valuestring=0;

        if (*value!=':')
        {
            ep=value;
            return 0;
        }	/* fail! */

        value=skip(parse_value(child,skip(value+1)));	/* skip any spacing, get the value. */

        if (!value)
            return 0;
    }

    // 判断当前字符是否位右边大括号,如果不是表示出错
    if (*value=='}')
        return value+1;	/* end of array */

    ep=value;

    return 0;	/* malformed. */
}


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