json: Add facility to specifiy objects and arrays as strings

Eg. Add a pre-generated JSON object, say {"name":"val"} into another object, giving
a result {"pregen":{"name":"val"}}
Similarly allow to read entire object string during parsing.
This commit is contained in:
Piyush Shah
2020-06-26 16:02:20 +05:30
parent c94d945958
commit b5cdfecdf7
4 changed files with 93 additions and 0 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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);