mirror of
https://github.com/espressif/esp-rainmaker.git
synced 2026-01-19 13:57:11 +00:00
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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user