cJSONコード読解(7)——JSON配列解析

1628 ワード

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. */
}