[PATCH] libubox: jshn: append_json using jshn.sh

Jaymin Patel jem.patel at gmail.com
Mon Sep 26 04:01:06 PDT 2022


Hi Felix,

Can you pls review this patch, If there is anything to update pls let
me know, and if it's fine, can we merge this?

Thanks
Jaymin


On Mon, Sep 19, 2022 at 1:02 AM Jaymin Patel <jem.patel at gmail.com> wrote:
>
> Whenever json_load or json_load_file is called, it calls
> json_init and due to that, it cleans up existing json data.
> With the addition of a new argument -a in jshn, It skips the step
> of json_init and appends new json into existing json. It helps in
> cases when there is a need to merge multiple json.
>
> A sample script with the usage of json_append and json_append_file
>
> cat /tmp/sample.sh
>
> . /usr/share/libubox/jshn.sh
>
> json_init
> json_add_string json1 json1
> json_dump
> j1=$(json_dump)
>
> json_init
> json_add_string json2 json2
> json_append "$j1"
> json_dump
> json_dump > /tmp/test.json
>
> json_init
> json_add_string json2 json2
> json_append "$j1"
> json_add_object old_json
> json_append_file /tmp/test.json
> json_dump
>
> Output:
> { "json1": "json1" }
> { "json2": "json2", "json1": "json1" }
> { "json2": "json2", "json1": "json1", "old_json": { "json2": "json2", "json1": "json1" } }
>
> Signed-off-by: Jaymin Patel <jem.patel at gmail.com>
> ---
>  jshn.c     | 22 ++++++++++++++--------
>  sh/jshn.sh |  8 ++++++++
>  2 files changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/jshn.c b/jshn.c
> index 1b685e5..971246f 100644
> --- a/jshn.c
> +++ b/jshn.c
> @@ -172,7 +172,7 @@ static int add_json_element(const char *key, json_object *obj)
>         return 0;
>  }
>
> -static int jshn_parse(const char *str)
> +static int jshn_parse(const char *str, bool append)
>  {
>         json_object *obj;
>
> @@ -183,7 +183,9 @@ static int jshn_parse(const char *str)
>                 fprintf(stderr, "Failed to parse message data\n");
>                 return 1;
>         }
> -       fprintf(stdout, "json_init;\n");
> +       if (!append) {
> +               fprintf(stdout, "json_init;\n");
> +       }
>         add_json_object(obj);
>         fflush(stdout);
>         json_object_put(obj);
> @@ -313,7 +315,7 @@ out:
>
>  static int usage(const char *progname)
>  {
> -       fprintf(stderr, "Usage: %s [-n] [-i] -r <message>|-R <file>|-o <file>|-p <prefix>|-w\n", progname);
> +       fprintf(stderr, "Usage: %s [-n] [-i] [-a] -r <message>|-R <file>|-o <file>|-p <prefix>|-w\n", progname);
>         return 2;
>  }
>
> @@ -338,7 +340,7 @@ static int avl_strcmp_var(const void *k1, const void *k2, void *ptr)
>         return c1 - c2;
>  }
>
> -static int jshn_parse_file(const char *path)
> +static int jshn_parse_file(const char *path, bool append)
>  {
>         struct stat sb;
>         int ret = 0;
> @@ -369,7 +371,7 @@ static int jshn_parse_file(const char *path)
>                 return 3;
>         }
>
> -       ret = jshn_parse(fbuf);
> +       ret = jshn_parse(fbuf, append);
>         free(fbuf);
>         close(fd);
>
> @@ -397,6 +399,7 @@ int main(int argc, char **argv)
>  {
>         extern char **environ;
>         bool no_newline = false;
> +       bool append_object = false;
>         bool indent = false;
>         struct env_var *vars;
>         int i;
> @@ -423,17 +426,17 @@ int main(int argc, char **argv)
>                 avl_insert(&env_vars, &vars[i].avl);
>         }
>
> -       while ((ch = getopt(argc, argv, "p:nir:R:o:w")) != -1) {
> +       while ((ch = getopt(argc, argv, "p:anir:R:o:w")) != -1) {
>                 switch(ch) {
>                 case 'p':
>                         var_prefix = optarg;
>                         var_prefix_len = strlen(var_prefix);
>                         break;
>                 case 'r':
> -                       ret = jshn_parse(optarg);
> +                       ret = jshn_parse(optarg, append_object);
>                         goto exit;
>                 case 'R':
> -                       ret = jshn_parse_file(optarg);
> +                       ret = jshn_parse_file(optarg, append_object);
>                         goto exit;
>                 case 'w':
>                         ret = jshn_format(no_newline, indent, stdout);
> @@ -441,6 +444,9 @@ int main(int argc, char **argv)
>                 case 'o':
>                         ret = jshn_format_file(optarg, no_newline, indent);
>                         goto exit;
> +               case 'a':
> +                       append_object = true;
> +                       break;
>                 case 'n':
>                         no_newline = true;
>                         break;
> diff --git a/sh/jshn.sh b/sh/jshn.sh
> index 7b0155d..ba3f1f3 100644
> --- a/sh/jshn.sh
> +++ b/sh/jshn.sh
> @@ -180,6 +180,14 @@ json_load() {
>         eval "`jshn -r "$1"`"
>  }
>
> +json_append() {
> +       eval "`jshn -a -r "$1"`"
> +}
> +
> +json_append_file() {
> +       eval "`jshn -a -R "$1"`"
> +}
> +
>  json_load_file() {
>         eval "`jshn -R "$1"`"
>  }
> --
> 2.25.1
>



More information about the openwrt-devel mailing list