diff --git a/components/json_generator/json_generator.c b/components/json_generator/json_generator.c index b189343..4cd241c 100755 --- a/components/json_generator/json_generator.c +++ b/components/json_generator/json_generator.c @@ -127,11 +127,21 @@ int json_gen_push_object(json_gen_str_t *jstr, char *name) jstr->comma_req = false; return json_gen_add_to_str(jstr, "{"); } + int json_gen_pop_object(json_gen_str_t *jstr) { jstr->comma_req = true; return json_gen_add_to_str(jstr, "}"); } + +int json_gen_push_object_str(json_gen_str_t *jstr, char *name, char *object_str) +{ + json_gen_handle_comma(jstr); + json_gen_handle_name(jstr, name); + jstr->comma_req = true; + return json_gen_add_to_str(jstr, object_str); +} + int json_gen_push_array(json_gen_str_t *jstr, char *name) { json_gen_handle_comma(jstr); @@ -145,6 +155,14 @@ int json_gen_pop_array(json_gen_str_t *jstr) return json_gen_add_to_str(jstr, "]"); } +int json_gen_push_array_str(json_gen_str_t *jstr, char *name, char *array_str) +{ + json_gen_handle_comma(jstr); + json_gen_handle_name(jstr, name); + jstr->comma_req = true; + return json_gen_add_to_str(jstr, array_str); +} + static int json_gen_set_bool(json_gen_str_t *jstr, bool val) { jstr->comma_req = true; diff --git a/components/json_generator/json_generator.h b/components/json_generator/json_generator.h index 1d24551..2dc527d 100755 --- a/components/json_generator/json_generator.h +++ b/components/json_generator/json_generator.h @@ -163,6 +163,25 @@ int json_gen_push_object(json_gen_str_t *jstr, char *name); */ int json_gen_pop_object(json_gen_str_t *jstr); +/** Push a JSON object string + * + * This adds a complete pre-formatted JSON object string to the JSON object. + * + * Eg. json_gen_push_object_str(jstr, "pre-formatted", "{\"a\":1,\"b\":2}"); + * This will add "pre-formatted":{"a":1,"b":2} + * + * \param[in] jstr Pointer to the \ref json_gen_str_t structure initilised by + * json_gen_str_start() + * \param[in] name Name of the JSON object string + * \param[in] object_str The pre-formatted JSON object string + * + * \return 0 on Success + * \return -1 if buffer is out of space (possible only if no callback function + * is passed to json_gen_str_start(). Else, buffer will be flushed out and new data + * added after that. + */ +int json_gen_push_object_str(json_gen_str_t *jstr, char *name, char *object_str); + /** Push a named JSON array * * This adds a JSON array like "name":[ @@ -193,6 +212,25 @@ int json_gen_push_array(json_gen_str_t *jstr, char *name); */ int json_gen_pop_array(json_gen_str_t *jstr); +/** Push a JSON array string + * + * This adds a complete pre-formatted JSON array string to the JSON object. + * + * Eg. json_gen_push_object_str(jstr, "pre-formatted", "[1,2,3]"); + * This will add "pre-formatted":[1,2,3] + * + * \param[in] jstr Pointer to the \ref json_gen_str_t structure initilised by + * json_gen_str_start() + * \param[in] name Name of the JSON array string + * \param[in] array_str The pre-formatted JSON array string + * + * \return 0 on Success + * \return -1 if buffer is out of space (possible only if no callback function + * is passed to json_gen_str_start(). Else, buffer will be flushed out and new data + * added after that. + */ +int json_gen_push_array_str(json_gen_str_t *jstr, char *name, char *array_str); + /** Add a boolean element to an object * * This adds a boolean element to an object. Eg. "bool_val":true diff --git a/components/json_parser/json_parser.c b/components/json_parser/json_parser.c index 13380b1..49885d8 100755 --- a/components/json_parser/json_parser.c +++ b/components/json_parser/json_parser.c @@ -209,6 +209,39 @@ int json_obj_get_strlen(jparse_ctx_t *jctx, char *name, int *strlen) return OS_SUCCESS; } +int json_obj_get_object_str(jparse_ctx_t *jctx, char *name, char *val, int size) +{ + json_tok_t *tok = json_obj_get_val_tok(jctx, name, JSMN_OBJECT); + if (!tok) + return -OS_FAIL; + return json_tok_to_string(jctx, tok, val, size); +} + +int json_obj_get_object_strlen(jparse_ctx_t *jctx, char *name, int *strlen) +{ + json_tok_t *tok = json_obj_get_val_tok(jctx, name, JSMN_OBJECT); + if (!tok) + return -OS_FAIL; + *strlen = tok->end - tok->start; + return OS_SUCCESS; +} +int json_obj_get_array_str(jparse_ctx_t *jctx, char *name, char *val, int size) +{ + json_tok_t *tok = json_obj_get_val_tok(jctx, name, JSMN_ARRAY); + if (!tok) + return -OS_FAIL; + return json_tok_to_string(jctx, tok, val, size); +} + +int json_obj_get_array_strlen(jparse_ctx_t *jctx, char *name, int *strlen) +{ + json_tok_t *tok = json_obj_get_val_tok(jctx, name, JSMN_ARRAY); + if (!tok) + return -OS_FAIL; + *strlen = tok->end - tok->start; + return OS_SUCCESS; +} + static json_tok_t *json_arr_search(jparse_ctx_t *ctx, uint32_t index) { json_tok_t *tok = ctx->cur; diff --git a/components/json_parser/json_parser.h b/components/json_parser/json_parser.h index 46e68a4..7233caa 100755 --- a/components/json_parser/json_parser.h +++ b/components/json_parser/json_parser.h @@ -38,6 +38,10 @@ int json_obj_get_int64(jparse_ctx_t *jctx, char *name, int64_t *val); int json_obj_get_float(jparse_ctx_t *jctx, char *name, float *val); int json_obj_get_string(jparse_ctx_t *jctx, char *name, char *val, int size); int json_obj_get_strlen(jparse_ctx_t *jctx, char *name, int *strlen); +int json_obj_get_object_str(jparse_ctx_t *jctx, char *name, char *val, int size); +int json_obj_get_object_strlen(jparse_ctx_t *jctx, char *name, int *strlen); +int json_obj_get_array_str(jparse_ctx_t *jctx, char *name, char *val, int size); +int json_obj_get_array_strlen(jparse_ctx_t *jctx, char *name, int *strlen); int json_arr_get_array(jparse_ctx_t *jctx, uint32_t index); int json_arr_leave_array(jparse_ctx_t *jctx);