diff --git a/examples/03_parsing_database.c b/examples/03_parsing_database.c index 15e7aad..a623870 100644 --- a/examples/03_parsing_database.c +++ b/examples/03_parsing_database.c @@ -36,7 +36,8 @@ bool parse_person(Jimp *jimp, Person *p) if (!jimp_number(jimp)) return false; p->body_count = jimp->number; } else { - jimp_unknown_member(jimp); + // jimp_unknown_member(jimp); + jimp_skip_member(jimp); return false; } } diff --git a/examples/database.json b/examples/database.json index 57356d8..498da0a 100644 --- a/examples/database.json +++ b/examples/database.json @@ -6,7 +6,8 @@ "location": "Wonderland", "body_count": 150, "name": "Alice Smith", - "age": 34 + "age": 34, + "height": 6 }, { "name": "Bob Johnson", diff --git a/jimp.h b/jimp.h index 995a05c..6bd32a4 100644 --- a/jimp.h +++ b/jimp.h @@ -102,6 +102,9 @@ bool jimp_is_string_ahead(Jimp *jimp); bool jimp_is_array_ahead(Jimp *jimp); bool jimp_is_object_ahead(Jimp *jimp); +/// Skips the member in the object +bool jimp_skip_member(Jimp *jimp); + #endif // JIMP_H_ #ifdef JIMP_IMPLEMENTATION @@ -445,4 +448,36 @@ static bool jimp__expect_token(Jimp *jimp, Jimp_Token token) return true; } +bool jimp_skip_member(Jimp *jimp) { + if (!jimp__get_token(jimp)) return false; + switch(jimp->token) { + case JIMP_NULL: + case JIMP_TRUE: + case JIMP_FALSE: + case JIMP_NUMBER: + case JIMP_STRING: + return true; + case JIMP_OBRACKET: { + while(jimp_array_item(jimp)) { + if (!jimp_skip_member(jimp)) return false; + } + return jimp_array_end(jimp); + } break; + case JIMP_OCURLY: { + while(jimp_object_member(jimp)) { + if (!jimp_skip_member(jimp)) return false; + } + return jimp_object_end(jimp); + } break; + case JIMP_INVALID: + case JIMP_EOF: + case JIMP_CCURLY: + case JIMP_CBRACKET: + case JIMP_COMMA: + case JIMP_COLON: + default: return false; + } + return false; +} + #endif // JIMP_IMPLEMENTATION