cJSONコード読解(7)——JSON配列解析
parse_arrayはjson配列解析を行う関数である.
1.まず、処理対象データが配列であるか否かを判断する
2、配列の左中括弧をスキップ
3、無駄な空白文字をスキップ
4、すぐ右中括弧であれば、配列が空であることを示し、そのまま戻る
5、配列が空でない場合はparse_を呼び出すvalue解析配列の最初の要素です.解析にエラーがなく、コンマが続くと、配列に他の要素があることを示し、ループに入り、各要素を順次解析します.
6、空白文字をスキップした後、次の文字が右中括弧かどうかを判断し、そうでなければ間違いない
7、処理が正しければ、次の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. */
}